C ++ Deque自定义类模板

时间:2014-02-08 00:43:30

标签: c++ templates syntax stl deque

我有一个类“板”,我试图把一个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行展开,我会非常感激。现在这个改变让我前进了。

1 个答案:

答案 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
    }
}

Live Example

你应该谷歌这个网站深入解释我在//评论背后的上述代码中写的要点。