小编cod*_*der的帖子

为什么使用前向声明而不是 #include 时会得到不完整的类型?

这里我有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)

c++ forward-declaration incomplete-type

2
推荐指数
1
解决办法
1142
查看次数

在一行中使用带有"temp"结构的向量推回(如果可能)

我有以下代码(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%确信它是正确的...任何指针(没有双关语意)在这里?

c++ struct vector

2
推荐指数
1
解决办法
1164
查看次数

将数组初始化为0的正确和最简单的语法方法

我试图找出将数组初始化为全零的正确方法(即好像你已经在数组上做了一个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},但我没有找到任何证明这实际上是正确的.

c++ arrays

2
推荐指数
1
解决办法
299
查看次数

如何用冒号回显消息?

这看起来很简单,但我很困惑 - 一直在寻找很多几乎匹配的问题,但却找不到答案.

我想做的就是这样:

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 )

windows batch-file

2
推荐指数
1
解决办法
636
查看次数

C++ 如何将成员函数传递给函子参数?

我正在使用 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,我真的想使用一个函数(因此,最终我可能能够传入一个外部函数)。

请参阅此处 …

c++ member-functions functor

2
推荐指数
1
解决办法
1284
查看次数

将 int * const 转换为 long int * const 警告

这很可能以前以其他方式被问过(如果不是,我会感到惊讶)但如果是,我正在努力寻找它。

鉴于:

#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)

c++ casting const-pointer

2
推荐指数
1
解决办法
91
查看次数

包含在头文件的末尾,是安全/良好的做法吗?

我一直在尝试编写自己的状态机,其中每个状态都是从状态基类派生的单独类.

无论我包含我的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)

c++ include

1
推荐指数
1
解决办法
2651
查看次数

基于C++ 11范围的多图循环 - 不能返回非常量对

我似乎无法看到我在这里做错了什么,并且稍微离开了我的深度.

我所拥有的是一些包含向量和多图的数据结构.

我想制作包含原始数据指针的第二个矢量/多图,这样如果我编辑第二个矢量/地图,数据就会在原始数据中发生变化.原因是该列表是基于某些标准的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)

c++ vector multimap c++11

1
推荐指数
1
解决办法
983
查看次数

返回*这给出了Weffc ++警告

我在这里有一些代码,我正在使用-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++ g++ c++11 weffc++

1
推荐指数
1
解决办法
174
查看次数

static_cast没有斜角括号代码片段我不明白

我正在寻找为基于c的freeRtos实现c ++包装器.我找到了这个链接

它只是一小段代码,但内部有以下内容:

  static void taskfun(void* parm) {
    static_cast(parm)->task();
       :
  }
Run Code Online (Sandbox Code Playgroud)

我一直认为static_cast需要<type>它.有人能解释一下这段代码对我有用吗? - 我觉得我错过了一些基本的东西:o

c++ static-cast

1
推荐指数
1
解决办法
69
查看次数