提问人:Sti 提问时间:2/19/2013 更新时间:2/19/2013 访问量:4405
C++ 从标头定义构造函数
C++ defining constructor from header
问:
class_one.h:
#ifndef CLASS_ONE
#define CLASS_ONE
#include <string>
namespace ones{
typedef enum{BLACK, WHITE, RED} b_color;
typedef char b_letter;
const b_letter letters[4] = {'A', 'B', 'C', 'D'};
class one{
b_color color;
b_letter letter;
public:
one(b_color, b_letter);
std::string combo();
b_color getColor();
b_letter getLetter();
};
}
#endif
给定此头文件,我应该如何创建 .cpp 文件,以及如何在另一个文件 main.cpp 中实例化此类? 我会这样想:
class_one.cpp
#include <iostream>
#include "class_one.h"
using namespace ones;
class one
{
b_color color;
b_letter letter;
public:
one(b_color c, b_letter l) //Not sure about this one..
{
color = c;
letter = l;
}
std::string combo()
{
return "blahblah temporary. letter: " + letter; //not finished
}
b_color getColor()
{
return color;
}
b_letter getLetter()
{
return letter;
}
};
然后要实例化它,我会做这样的事情:
main.cpp
#include "class_one.h"
int main()
{
ones::one test(ones::BLACK, ones::letters[0]);
//cout<<test.name()<<endl;
return 0;
}
所有内容都是从更大的文件集群中提取的,但这是我问题的基本要素。头文件应该是正确的,但我不确定如何实例化“one”类,而不是使用该构造函数。我认为我在.cpp中定义的构造函数是错误的。我习惯了 Java,所以我从未见过像头文件中那样的构造函数,如果它甚至是一个构造函数的话。对我来说,它看起来不是我习惯的: 运行此命令时,出现以下错误:method(int, int)
method(int a, int b)
main.obj : error LNK2019: unresolved external symbol "public: __thiscall ones::one::one(enum ones::b_color, char)" (??0one@ones@@QAE@W4b_color@1@D@Z) referenced in function _main
<path>/project.exe : fatal error LNK1120: 1 unresolved externals
对不起,我在这里的命名非常愚蠢,但它确实有意义。可能是问题代码中的一些打字错误,因为我现在已经手写了大部分内容。 任何帮助不胜感激。
答:
2赞
Publius
2/19/2013
#1
您的 cpp 文件应如下所示:
#include "class_one.h"
ones::one::one(ones::one::b_color c, ones::one::b_color l)
{
//code here
}
std::string ones::one::combo()
{
// code here
}
// additional functions...
等等。您无需使用类块重新定义类,只需指定单个函数定义,就像我在这里展示的那样。函数定义格式应如下所示:
[return type] [namespace]::[class]::[function]([parameters])
{
// code here
}
看起来你擅长实例化。您也不必重新声明成员变量。
评论
0赞
Sti
2/19/2013
哦,我以为这就是 .cpp 文件中为我做的事情..但是好吧,我现在尝试了,但是“Visual C++ 2010 Express”现在在所有方法下都给了我红线和错误,说.构造函数说 ,它给了我两个不同的“调用示例”之类的东西: 和 ,这让我认为第一个示例是我试图做的,第二个是它希望我调用的?using namespace ones;
Error: qualifier must be base class of "one"
Error: type used as constructor name does match type "one"
one::one(ones::b_color c, b_letter l)
one::one(const one &)
0赞
Publius
2/19/2013
我的坏,应该是 ones::one::b_color 和 ones::one::b_letter。或者你可以做“使用命名空间 ones;”,我认为如果你删除 cpp 文件中的“ones::”,这应该会起作用。编辑我的答案以反映这一点。
0赞
Sti
2/19/2013
实际上,只有当我从所有内容中删除它时,它才会清理,我想这是因为方法是 IN .但这并不能解决原来的问题。问题是 .h 文件应该是完整的,但那里的构造函数对我来说看起来很荒谬,我不知道如何在 .cpp 文件中定义它。正如我所说,在标题中它说的是而不是构造函数,我不知道这意味着什么。头文件应该是正确的,所以我不想更改它。::one
class one {}
public: one(b_color, b_letter);
public: one(b_color c, b_letter l);
0赞
Publius
2/19/2013
任一函数声明均有效。您的构造函数应该像我上面所示声明工作。发布整个 CPP 文件代码。
1赞
Sti
2/20/2013
啊,现在我仔细阅读了你的回答,我似乎误解了你所说的“重新定义类块”的意思。以前我认为我唯一的问题是我的方法名称需要 ones::one:: 等。当你提供那部分答案时,我想我忘了继续阅读。我删除了额外的类块和其他重新定义,现在它可以工作了!谢谢。对不起我的无能。
评论