我有一个类“板”,我试图把一个deque成员。我用deque的一个int对象编写代码,一切正常,所以我认为这是设置模板的问题自定义类,但我从未在C ++中这样做过。
board.h:
#ifndef __board_h__
#define __board_h__
using namespace std;
#include <deque>
#include "noble_card.h"
class board;
class board
{
public: deque<noble_card> line;
public: board();
public: ~board();
};
#endif
board.cpp:
#include <deque>
#include "noble_card.h"
board::board() {
deque<noble_card> line;
}
board::~board() {}
我想我的构造方法可能有问题,因为deque错误地记录了很多我无法跟踪它的事情。
noble_card.h:
#include <string>
#ifndef __noble_card_h__
#define __noble_card_h__
#include "board.h"
class noble_card
{
public: string name;
public: int id;
public: int vp;
public: noble_card(int _vp);
public: ~noble_card();
};
#endif
noble_card.cpp:
#include "noble_card.h"
noble_card::noble_card(int _vp) {
this->vp = _vp;
}
noble_card::~noble_card() {
}
现在,当我尝试将元素推送到此双端队列时出现问题,我有一个类似的for循环:
board b;
for (unsigned i = 0; i < 12; i++) {
noble_card nc(i);
b->line.push_back( nc );
}
我一直无法生成赋值运算符,无法生成复制构造函数,并且std :: deque:'noble_card'不是参数'_Ty'(board.h)的有效模板类型参数。我假设这是因为我没有模板化我的类并重写了复制/构造函数方法来告诉deque如何排序/删除/分配/复制这种类。我基本上只是想在deque中使用一个自定义的c ++类,它比C#和其他标准库复杂得多,你只需将它推到那里就可以了。它会照顾它。 / p>
编辑:
#ifndef __noble_card_h__
#define __noble_card_h__
using namespace std;
class noble_card {
public: char* name;
public: int id;
public: int vp;
public: noble_card(char* _name, int _id, int _vp) : name(_name), id(_id), vp(_vp) {}
};
#endif
以这种方式设置noble_card.h似乎满足deque的copy / alloc / constructor的要求。我仍然不完全理解它,因为它似乎是速记,所以如果任何人都可以在第10行展开,我会非常感激。现在这个改变让我前进了。
答案 0 :(得分:0)
您的变量b
不是指针而是operator->
b->line.push_back(nc);
因此将无效。您必须使用operator.
b.line.push_back(nc);
C++
不是C#
(迷你代码审核)你写的是你来自C#。你应该注意两种语言之间存在很多风格差异。我不知道C#,但这是第二次接受你的代码,处理最痛点(我正在评论标题包含,因为它对我使用的在线编译器不起作用)
// noble_card.h
#include <string>
class noble_card
{
public: // single section of public stuff (are you sure you don't need private data?)
std::string name; // never do: "using namespace std;" in a header!
int id;
int vp;
noble_card(int _vp);
// compiler-generated default constructor is just fine here
};
// noble_card.cpp
noble_card::noble_card(int _vp): vp(_vp) {} // initialize member in initializer-list
// board.h
// #include "noble_card.h"
#include <deque>
class board
{
public: // single section of public stuff (are you sure you don't need private data?)
std::deque<noble_card> line; // never do: "using namespace std;" in a header!
// compiler generated default constructor and destructor are just fine here
};
// board.cpp (not necessary for your current impl)
// #include "board.h" // takes care of "noble_card.h"
// main.cpp
int main()
{
board b;
for (unsigned i = 0; i < 12; ++i) {
b.line.emplace_back(i); // C++11 allows you to construct-in-place
}
}
你应该谷歌这个网站深入解释我在//
评论背后的上述代码中写的要点。