这里我有state_machine.h:
#ifndef STATE_MACHINE_H
#define STATE_MACHINE_H
// state machine classes
//#include "state_t.h"
class state_t;
class state_machine
{
public:
state_machine();
void change_state(state_t *newState);
void process_state(int data);
private:
state_t *_state;
};
#endif // STATE_MACHINE_H
Run Code Online (Sandbox Code Playgroud)
这是state_t.h:
#ifndef STATE_T_H
#define STATE_T_H
#include <QByteArray>
#include <QDebug>
//#include "state_machine.h"
class state_machine;
class state_t
{
public:
state_t(QByteArray stateName);
virtual ~state_t();
virtual void processState(state_machine *sm, int input) = 0;
void defaultUnknownEventHandler(int event);
QByteArray name;
};
#endif // STATE_T_H
Run Code Online (Sandbox Code Playgroud)
然后是一些状态类,它们或多或少都是相同的,我只列出一个:
测试状态1.h:
#ifndef TESTSTATE1_H
#define TESTSTATE1_H
#include "state_t.h"
class testState1 : …Run Code Online (Sandbox Code Playgroud) 我有以下代码(butchered使它变得小而具体):
struct myType_t
{
int a;
string str;
};
typedef vector<myType_t> dataVect_t; // Just for ease of use
...main(...)
{
dataVect_t myData;
myData.push_back((myType_t) {1, "test"}); // THIS IS THE LINE IN QUESTION!
}
Run Code Online (Sandbox Code Playgroud)
编辑:抱歉,这已更正为创建myType_t的实例(不是dataVect_t)
我想将intStringPairVect_t的实例推回到向量中,但我真的不想创建一个变量来执行此操作.我正在做什么似乎编译,但我不是100%确信它是正确的...任何指针(没有双关语意)在这里?
我试图找出将数组初始化为全零的正确方法(即好像你已经在数组上做了一个memset).
我在堆栈溢出(和其他来源)的各个方面找到了以下方法:
char myArray1[10] = {0};
char myArray2[10] = {0,};
char myArray3[10] = {[0 ... 9] = 0};
char myArray4[10] = {0,0,0,0,0,0,0,0,0,0};
Run Code Online (Sandbox Code Playgroud)
我更喜欢最简单的语法变体......我使用的是{0},但我没有找到任何证明这实际上是正确的.
这看起来很简单,但我很困惑 - 一直在寻找很多几乎匹配的问题,但却找不到答案.
我想做的就是这样:
echo c:\another\test\file.h(22,11) : warning 123: this is a test warning
Run Code Online (Sandbox Code Playgroud)
但这给出了错误:: was unexpected at this time.
所以我尝试过:
echo "c:\another\test\file.h(22,11) : warning 123: this is a test warning"
Run Code Online (Sandbox Code Playgroud)
产生:"c:\another\test\file.h(22,11) : warning 123: this is a test warning".但我不想要报价.所以我尝试使用转义字符"^":
echo c^:\another\test\file.h(22,11) ^: warning 123^: this is a test warning
Run Code Online (Sandbox Code Playgroud)
但这没有效果.我怎样才能做到这一点?
更新:
这行代码在if块中,这似乎有所不同!:
if exist "somefile" (
echo c:\another\test\file.h(22,11) : warning 123: this is a test warning
)
我正在使用 TRI DDS - 这是我尝试调用的函数的原型:
template<typename T , typename Functor >
dds::sub::cond::ReadCondition::ReadCondition (
const dds::sub::DataReader< T > & reader,
const dds::sub::status::DataState & status,
const Functor & handler
)
Run Code Online (Sandbox Code Playgroud)
所以我有一个看起来有点像这样的类(省略了一些不相关的内容):
MyClass test{
public:
test(){... mp_reader = ...}; // not complete
start_reader()
{
dds::sub::cond::ReadCondition rc(*mp_reader,
dds::sub::status::DataState::any(),
do_stuff()); // This does not work
}
void do_stuff() {...}
private:
dds::sub::DataReader* mp_reader;
}
Run Code Online (Sandbox Code Playgroud)
所以我只是尝试传入函数 do_stuff() ..我知道这行不通,但我不确定要在这里放入什么来代替参数const & functor。我可以传入成员函数吗?- 如何指定类的实例?
我尝试将 lambda 放在那里并且它起作用了 - 但我无法访问 lambda 中的 mp_reader 因为它不在 lambda 的范围内。但无论如何,我真的不想使用 lambda,我真的想使用一个函数(因此,最终我可能能够传入一个外部函数)。
请参阅此处 …
这很可能以前以其他方式被问过(如果不是,我会感到惊讶)但如果是,我正在努力寻找它。
鉴于:
#include <iostream>
#include <string>
int main()
{
int * const pi = new int(1);
long int * const pl = reinterpret_cast<long int * const>(pi);
std::cout << "val: " << *pl << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我收到警告:
<source>: In function 'int main()':
<source>:7:27: warning: type qualifiers ignored on cast result type [-Wignored-qualifiers]
7 | long int * const pl = reinterpret_cast<long int * const>(pi);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ASM generation compiler returned: 0
<source>: In function 'int main()':
<source>:7:27: warning: type …Run Code Online (Sandbox Code Playgroud) 我一直在尝试编写自己的状态机,其中每个状态都是从状态基类派生的单独类.
无论我包含我的state_t类文件(#include"state_t.h"),我都希望包含所有派生的状态类头文件,因此每次我需要使用状态机时,我都不必将它们全部包含在内.创造一个新的国家.
因为直到state_t.h结束才定义"state_t"我只能在state_t.h文件的末尾包含我的状态文件.我以前从未编写过这样做的代码,看起来有点奇怪!我可以添加一个顶级的"statemachine.h"来收集所有文件,但这似乎是浪费.
我的问题是:这样做是正确的/安全的吗?任何缺点/问题?
注意:目前我的代码都是测试代码并且用Qt编写,但它应该是一个直接的c ++问题.
这是我的基类(state_t.h) - 注意最后的 #include :
#ifndef STATE_T_H
#define STATE_T_H
#include <QByteArray>
#include <QDebug>
class state_t
{
public:
state_t(QByteArray stateName);
virtual ~state_t();
virtual state_t * processState(int input) = 0;
QByteArray getState();
QByteArray name;
};
#include "teststate1.h"
#include "teststate2.h"
#endif // STATE_T_H
Run Code Online (Sandbox Code Playgroud)
这是一个状态派生类(teststate1.h):
#ifndef TESTSTATE1_H
#define TESTSTATE1_H
#include "state_t.h"
class testState1 : public state_t
{
public:
testState1();
state_t *processState(int input);
};
#endif // TESTSTATE1_H
Run Code Online (Sandbox Code Playgroud)
这是我的main.cpp:
#include <QCoreApplication>
#include <QDebug>
#include "state_t.h"
int main(int argc, char …Run Code Online (Sandbox Code Playgroud) 我似乎无法看到我在这里做错了什么,并且稍微离开了我的深度.
我所拥有的是一些包含向量和多图的数据结构.
我想制作包含原始数据指针的第二个矢量/多图,这样如果我编辑第二个矢量/地图,数据就会在原始数据中发生变化.原因是该列表是基于某些标准的orig的临时子集.
首先我在矢量上尝试了它,它似乎工作,这是一个工作的例子:
std::vector<std::string> strVect;
strVect.push_back("test1");
strVect.push_back("test2");
strVect.push_back("test3");
std::vector<std::string *>strpVect;
for (std::string &str : strVect)
{
strpVect.push_back(&str);
}
Run Code Online (Sandbox Code Playgroud)
这里,strpVect中的元素指向strVect中的原始元素.
现在我想为multimaps做同样的事情:
std::multimap<int, std::string> strMap;
strMap.insert(std::pair<int, std::string>(1, "test1"));
strMap.insert(std::pair<int, std::string>(2, "test2"));
strMap.insert(std::pair<int, std::string>(3, "test3"));
std::multimap<int, std::string *>strpMap;
for (std::pair<int, std::string> &val : strMap) // <<<<< error here
{
strpMap.insert(std::pair<int, std::string *>(val.first, &val.second));
}
Run Code Online (Sandbox Code Playgroud)
现在,当我运行这个时,我得到了错误 invalid init of non-const reference of type std::pair....
如果我使它成为一个const然后它的工作原理:
std::multimap<int, std::string> strMap;
strMap.insert(std::pair<int, std::string>(1, "test1"));
strMap.insert(std::pair<int, std::string>(2, "test2"));
strMap.insert(std::pair<int, std::string>(3, "test3"));
std::multimap<int, std::string *>strpMap;
for (const std::pair<int, …Run Code Online (Sandbox Code Playgroud) 我在这里有一些代码,我正在使用-Weffc ++ -Wall -Wextra进行编译.
基本上我有这个片段:
class base
{};
class test : public base
{
public:
base& operator=(int)
{
return *this;
}
};
Run Code Online (Sandbox Code Playgroud)
我收到警告:warning: 'operator=' should return a reference to '*this' [-Weffc++].我不确定该警告该怎么做.我已经读过,这是完全可以的(即返回一个尊重这个).
有没有办法让我的编辑器开心?
我正在寻找为基于c的freeRtos实现c ++包装器.我找到了这个链接
它只是一小段代码,但内部有以下内容:
static void taskfun(void* parm) {
static_cast(parm)->task();
:
}
Run Code Online (Sandbox Code Playgroud)
我一直认为static_cast需要<type>它.有人能解释一下这段代码对我有用吗? - 我觉得我错过了一些基本的东西:o