首页 > 解决方案 > C++ 错误 C2600:无法定义编译器生成的特殊成员函数(必须先在类中声明)

问题描述

在编译使用自定义复制构造函数的简单程序时,我收到 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& obj);到头文件中。

标签: c++classconstructorcopy-constructor

解决方案


您没有在 .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_;
    };
}

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


推荐阅读