[英]How to convert this VC++ 6 code to VC++ 2008?
原谅我,我的C ++非常生疏。 但我正在尝试使用一些旧代码并在Visual C ++ 2008下重新编译它。它最初是为Visual C ++ 6.0编写的
我得到的错误是这样的:
错误C4430:缺少类型说明符 - 假定为int。 注意:C ++不支持default-int
好吧看起来很简单。 但后来我看看有问题的代码行:
operator=(int i) {SetAsInt(i);};
并且它似乎声明了类型IS。 那我错过了什么?
跟进:
我接受了Micheals的建议并添加了函数的返回类型(类),并添加了返回; 到每个人的结尾。 然后我碰到了这个:
operator=(const CString& str);
没有定义功能体......究竟是什么意思?
你需要让operator=()
方法返回一些东西(如果诊断不是错误,它会假设为int,因为错误信息有点令人困惑地指出)。
通常,它将是对操作员正在处理的对象的引用,因此可以将分配链接为正常的赋值表达式。 就像是:
// where T is the class for this operator= implementation
T& operator=( int i) {
// ...
return *this;
}
正如迈克尔所说,operator =需要一个返回类型,但这种类型可能是无效的:
class A {
...
void operator = ( int i ) {
SetAsInt(i);
}
};
虽然这意味着你将无法进行“菊花链”任务。
关于后续行动,可能会说禁止为班级分配:
class B {
private:
void operator =( const B & );
};
使赋值op(通常是copy ctor)私有然后不实现它们意味着不可能分配(或复制)类实例,这对于大多数面向业务的类来说是理想的行为。
返回ANYTHING但是lval通常是错误的,仅用于非常特殊的情况
肯定返回一个const引用排除了赋值链(a =(b = c)),而运算符的一部分就是使类的行为类似于内置类型
对于第二个问题,声明就像用于防止复制对象一样。
问题:如何防止对象复制?
答案:将复制构造函数和赋值运算符声明为私有成员,而不定义它们。 任何涉及直接或间接复制该类的语句都将导致编译错误。 这种技术并不完全是优雅的画面,但在现代C ++中,没有其他方法可以低成本地阻止复制。
关于你的编辑:它只是意味着该函数已被声明,但未定义。 编译器知道它存在,因此调用它是合法的。 但它会生成链接器错误,除非编译器实际上能够在某处找到主体。
通常,您在头文件中定义函数,然后在.cpp文件中,您有类似的东西
// Assuming the class it is a member of is called Foo
Foo& Foo::operator=(const CString& str) {
...
}
这里唯一需要注意的是Foo ::前缀。 因为这个定义不在类定义本身之内,所以我们必须使用这个前缀来指定operator =我们定义属于Foo类。
好吧,那是一个赋值算子。 它有助于定义如何将其他对象(包括相同类型和其他类型)分配给它所定义的类的实例。
正确的语法是(假设您的类被称为'对象'):
const Object& operator=(const Object& other)
{
// copy members, one at a time.
this->member1 = other.member1;
return *this;
}
请注意,返回类型是常量。 这是为了避免语义错误,语法正确的语句,例如:
Object A, B, C;
(A = B) = C;
如果你将返回类型定义为常量,上面的代码将无法编译(合理的,因为它真的搞砸了),而省略const将允许这样的错误代码编译,当然有人会拉他们的头发试图弄清楚怎么了。
PS你可能想要考虑一下:如果你从返回类型中省略const并执行(A = B)= C,会发生什么? 码?
关于后续问题,在这种情况下,返回类型可以是任何内容。 但是,由于大多数赋值运算符都返回对声明它们的类的引用,因此最好只返回它,以免混淆读者。
CString& operator=(const CString& str);
据推测,此函数在类的private
部分中声明。 这是使类的对象不可赋值的标准习惯用法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.