C ++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)[重复]

Posted

技术标签:

【中文标题】C ++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)[重复]【英文标题】:C++ Error C2600: Cannot define a compiler-generated special member function (must be declared in the class first) [duplicate] 【发布时间】:2020-07-10 18:16:58 【问题描述】:

在编译使用自定义复制构造函数的简单程序时,我收到 C2600 错误(在标题中)。

我的 .h 文件是

#pragma once

namespace uiuc 
    class Cube 
    public:
        Cube();
        double getVolume();
        double getSurfaceArea();
        void setLength(double length);

    private:
        double length_;
    ;

我的 Cube.cpp 文件是

#include "Cube.h"
#include <iostream>

namespace uiuc 
    Cube::Cube() 
        length_ = 1;
        std::cout << "Default consturctor invoked" << std::endl;
    
    Cube::Cube(const Cube& obj) 
        length_ = obj.length_;
        std::cout << "Copy consturctor invoked" << std::endl;
    

    double Cube::getVolume() 
        return length_ * length_* length_;
    
    double Cube::getSurfaceArea() 
        return 6 * length_* length_;
    
    void Cube::setLength(double length) 
        length_ = length;
    

而我的 main.cpp 文件是

#include <iostream>
#include "Cube.h"

int main() 

    uiuc::Cube c;
    uiuc::Cube mycube = c;

    return 0;

我不明白为什么会抛出这个错误。有什么建议吗?

编辑: 非常感谢您的快速回复。我是 C++ 的新手,如果这看起来微不足道,我很抱歉。 正如其他人所提到的,修复方法是将Cube(const Cube&amp; obj); 添加到头文件中。

【问题讨论】:

将此声明添加到您的类定义中Cube(const Cube&amp; obj); 编译器错误告诉您确切地出了什么问题,以及如何解决它。 编译器不会抛出错误,抱歉,它很快就成了我的小烦恼。 This question 和 several others 几乎相同,只是它们尝试定义默认构造函数而不在类定义中声明它。 【参考方案1】:

您没有在 .h 文件中声明构造函数。

应该是这样的:

#pragma once

namespace uiuc 
    class Cube 
    public:
        Cube();
        Cube(const Cube& obj); // This was missing.
        double getVolume();
        double getSurfaceArea();
        void setLength(double length);

    private:
        double length_;
    ;

然后你应该能够在类定义之外定义它。

【讨论】:

【参考方案2】:

功能:

Cube::Cube(const Cube& obj) 
    length_ = obj.length_;
    std::cout << "Copy consturctor invoked" << std::endl;

在 cpp 文件中被声明为 Cube 的成员函数,但在您的类定义中缺少它。

它应该在这里:

class Cube 
public:
    Cube(const Cube& obj)    
    // ...
;

【讨论】:

以上是关于C ++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Linux 中编译 C 代码时,Mex 为 // 生成错误

C语言学习笔记--#error #line 和 #pragma 的使用

error LNK2019: 无法解析的外部符号

如何将源文件编译成库文件

编译C程序出现多重定义,怎么解决?

main函数是必须的吗