我刚刚写了一个包含一些静态数据成员的类,但现在我收到有关"未定义引用"的错误.为什么这不起作用?我究竟做错了什么?
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
我的问题源于Scott Meyers 研究Effective C++.在该书的第二项中,写下如下:
要将常量的范围限制为类,必须使其成为成员,并且为了确保最多只有一个常量副本,必须使其成为静态成员.
这是正确的写.然后立即给出以下示例:
class GamePlayer {
private:
static const int NumTurns = 5;
int scores[NumTurns];
....
};
Run Code Online (Sandbox Code Playgroud)
然后写下以下示例:
你在上面看到的是一个声明,而不是NumTurns的定义.
我的第一个问题是:这个陈述的含义是什么?
紧接着提到以下内容:
通常C++要求您为所使用的任何内容提供定义,但是静态和整数类型的类特定常量(例如 - 整数,字符,bools)是一个例外.只要您不接受他们的地址,您就可以声明它们并在不提供定义的情况下使用它们.如果您确实将类的地址设为常量,或者即使您没有使用该地址,您的编译器也错误地坚持定义,您提供了一个单独的定义,如下所示:
const int GamePlayer::Numturns; //definition of NumTurns
为什么现在它是一个定义而不是声明?
我理解函数上下文中的差异,但在常规变量的上下文中不理解它.此外,有人可以扩展作者的意思
...如果你确实把一个类的地址定为常数,或者如果你的......部分引用了上面引用的段落?
PS:我是C++的新手.
我创建了Objective C Header文件.并在其中添加了一些属性.
我
static NSString* const kColor005C98 = @"005C98";在Constants.h档案中 宣布
我在Bridging-Header文件中将此文件定义为#import "Constants.h"
现在,当我想kColor005C98在某个swift文件中使用此属性时,它失败了构建,我得到了
架构armv7的未定义符号:"_kColor005C98",引自:
我不知道我还需要做什么,所以我没有得到这个错误?(我已成功在其他目标C文件中使用此属性,在这种情况下没有问题)
我倾向于使用单词define,declare和assign可互换,但这似乎会导致一些人的冒犯.这是否合理?我是否应该仅在第一次使用"声明"一词时分配给变量?或者还有更多呢?
如果一个类只有一个带有一个参数的构造函数,那么如何声明一个数组呢?我知道在这种情况下推荐使用矢量.例如,如果我有一个班级
class Foo{
public:
Foo(int i) {}
}
Run Code Online (Sandbox Code Playgroud)
如何声明包含10000个Foo对象的数组或向量?
void weight_data::rev_seq(string &seq){
//TODO
std::reverse(seq.begin(), seq.end());
}
Run Code Online (Sandbox Code Playgroud)
在这个C++的方法,我觉得这个方法不返回任何东西,所以前缀void,这是什么::告诉之间的关系weight_data和rev_seq(string &seq)?谢谢!
在调试模式下编译时,我的xcode编译有以下链接错误:
"<method name>", referenced from:
Vtable for <classname>in <objectfile.o>
"non-virtual thunk to <method name>", referenced from:
Vtable for <classname>in <objectfile.o>
Run Code Online (Sandbox Code Playgroud)
奇怪的是:它只发生在我的一个构建目标中(两个目标对于该代码几乎相同),如果这些方法在头文件中定义而不是.cpp,则它对两个目标都可以正常工作.
所有这些方法都是纯虚拟的.发生这些错误的类继承自多个类,但只有其中一个会导致这些错误.
任何人都知道导致此错误的原因是什么?
我认为区别在于declaration没有参数类型......
为什么这样做:
int fuc();
int fuc(int i) {
printf("%d", i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但这无法编译:
int fuc();
int fuc(float f) {
printf("%f", f);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
随着消息:
错误:'fuc'的冲突类型.注意:具有默认促销的参数类型不能与空参数名称列表声明匹配
我是C++的新手.
我有一个这样的课:
class CodeTest
{
private:
static const int TOTAL=100;
};
Run Code Online (Sandbox Code Playgroud)
是TOTAL一个声明或定义?
当我阅读Scott Meyer的书时,有人提到在实现文件中我们需要定义如下内容:
const int CodeTest::TOTAL;
Run Code Online (Sandbox Code Playgroud)
为什么需要这个?
这个答案说:
......最后,
Run Code Online (Sandbox Code Playgroud)typedef struct { ... } Foo;声明一个匿名结构并为其创建一个typedef.因此,使用此构造,它在标记名称空间中没有名称,只有typedef名称空间中的名称.这意味着它也无法向前宣布.如果要进行前向声明,则必须在标记名称空间中为其指定名称.
什么是前瞻性声明?