如何将这个VC ++ 6代码转换为VC ++ 2008?

时间:2009-04-11 17:06:24

标签: c++ visual-studio visual-studio-2008 visual-c++

原谅我,我的C ++非常生疏。但我试图采取一些旧代码并在Visual C ++ 2008下重新编译它。它最初是为Visual C ++ 6.0编写的

我得到的错误是:

  

错误C4430:缺少类型说明符 - 假设为int。注意:C ++不支持default-int

好吧看起来很简单。但接下来我会看一下令人讨厌的代码:

operator=(int i) {SetAsInt(i);};

似乎声明了IS类型。那我错过了什么?

关注:

我接受了Micheals的建议并添加了函数的返回类型(类),并添加了将此返回; 添加到每个函数的末尾。然后我碰到了这个:

operator=(const CString& str);

没有定义函数体......究竟是什么意思?

7 个答案:

答案 0 :(得分:7)

你需要让operator=()方法返回一些东西(如果诊断不是错误,它会假定为int,因为错误信息有点令人困惑地表示)。

通常它是对运算符正在处理的对象的引用,因此可以像在正常赋值表达式中一样链接赋值。类似的东西:

// where T is the class for this operator= implementation

T& operator=( int i) {
     // ...
    return *this;
}

答案 1 :(得分:3)

正如迈克尔所说,operator =需要一个返回类型,但这种类型可能是无效的:

class A {
   ...  
   void operator = ( int i ) {
      SetAsInt(i);
   }
};

虽然这意味着您将无法进行“菊花链”分配。

关于后续行动,可能会说禁止上课:

class B {
    private:
        void operator =( const B & );    
};

将赋值op(通常是copy ctor)设为私有,然后不实现它们意味着不可能分配(或复制)类实例,这对于大多数面向业务的类来说是理想的行为。

答案 2 :(得分:2)

对于第二个问题,声明就像用于防止复制对象一样。

来自the C++ Reference Guide by Danny Kalev

  

问题:如何防止   对象的复制?

     

答案:声明复制构造函数   和赋值运算符为私有   成员,没有定义它们。任何   声明涉及直接或   间接复制该类将   导致编译错误。这个   技术并不完全是图片   优雅,但在当代C ++   没有其他方法可以阻止复制   廉价。

答案 3 :(得分:2)

关于你的编辑: 它只是表示函数已声明,但未定义。编译器知道它存在,因此调用它是合法的。但它会产生一个链接器错误,除非编译器实际上能够在某处找到主体。

通常,您在头文件中定义函数,然后在.cpp文件中,您有类似

的内容
// Assuming the class it is a member of is called Foo
Foo& Foo::operator=(const CString& str) {
 ...
}

这里唯一需要注意的是Foo ::前缀。因为这个定义不在类定义本身之内,所以我们必须使用这个前缀来指定operator =我们定义的属于Foo类。

答案 4 :(得分:2)

返回ANYTHING但是lval通常是错误的,仅在非常特殊的情况下使用

当然返回一个const引用会排除赋值链接(a =(b = c)),而运算符的一部分就是使类的行为类似于内置类型

答案 5 :(得分:1)

嗯,那是一个赋值算子。它有助于定义如何将其他对象(包括相同类型和其他类型)分配给它所定义的类的实例。

正确的语法是(假设您的类名为'Object'):

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将允许这样的错误代码编译,当然有人会拉他们的头发尝试找出问题所在。

P.S。您可能想要考虑一下:如果从返回类型中省略const并执行(A = B)= C,会发生什么?码?

答案 6 :(得分:1)

关于后续问题,在这种情况下,返回类型可以是任何内容。但是,由于大多数赋值运算符都返回对它们声明的类的引用,因此最好只返回它,以免混淆读者。

CString& operator=(const CString& str);

据推测,此函数在类的private部分中声明。这是使类的对象不可赋值的标准习惯用法。