【问题标题】:c++, Base class constructor seperate declearation and implementationc++,基类构造函数单独声明和实现
【发布时间】:2016-05-16 05:15:50
【问题描述】:

在我的 C++ 程序中,我有单独的 .h 和 .cpp 文件,到目前为止一切正常,除非我想为派生类使用基类构造函数。它正在工作,但前提是我在类减速时放置函数定义。 这是 .h 文件的工作代码。

#include <iostream>
using namespace std;

class property
{
    public:
        property();
        property(const property & src);
        property(int src);
        ~property();
        virtual int disp() const = 0;
        int get_ownable();          
    private:

    protected:

        int ownable;
};

class rr : public property
{
    public:
    rr();
    rr(const rr & src);
    rr(int src):property(src)
    {cout << "\nderived class was called\n";};
    ~rr();

    virtual int disp() const;       
    private:    
    protected:      
};

imp.cpp(实现)文件是

#include "head.h"

#include <iostream>


using namespace std;


//property class implimentations

property::property()
{
    ownable = 0;
}


property::property(const property & src)
{
    ownable = src.ownable;
}



property::property(int src)
{
    ownable = src;
    cout << "\nparent class called\n";
}

property::~property()
{

}

int property::get_ownable()
{
    return ownable;
}

rr::rr()
{}
rr::rr(const rr & src)
{
    ownable = src.ownable;
}




/*
rr::rr(int src):property(src)
{
    cout << "\nderived class was called\n";
}
*/



rr::~rr()
{
}
int rr::disp() const
{
}

还有其他代码,但工作正常且未连接到此代码。输出是

parent class called
derived class was called

这样就可以了,但是如果我取消注释掉 .imp 文件中的函数并删除 .h 中的声明

    rr(int src):property(src);

我得到了错误

head.h: IN constructor 'rr::rr(int)':
head.h 113: error: expeted '{' at end of input
imp.cpp: at global scope:
imp.cpp:348:error: redefiniton of 'rr::rr(int);
head.h.113: error: 'rr::rr(int); previousle defined here

我可以在网上找到的所有示例都使用类声明中定义的所有函数来执行此操作。我找不到任何关于如何使用 2 个文件进行操作的示例。谁能告诉我如何在单独的文件中定义基类构造函数调用? 我在使用 g++ 编译器的 Linux 系统上。

【问题讨论】:

  • 构造初始化列表是实现的一部分,而不是声明。换句话说,它与构造函数体一起使用。您可以将两者都放入 .h 文件中,也可以将两者都放入 .cpp 文件中;你不能把它们分开。

标签: c++ class inheritance constructor derived-class


【解决方案1】:

这样

BaseClass.h

#pragma once

class BaseClass {
public:
    BaseClass(int a);

private:
    int a_private;
};

BaseClass.cpp

#include "BaseClass.h"
#include <iostream>
using std::cout;
using std::endl;

BaseClass::BaseClass(int a) {
    cout << "Base class constructor called" << endl;
    this->a_private = a;
}

Derived.h

#pragma once

#include "BaseClass.h"

class Derived : public BaseClass {
public:
    Derived(int a);
private:
    int a_private;
};

Derived.cpp

#include "Derived.h"
#include <iostream>
using std::cout;
using std::endl;

Derived::Derived(int a) : BaseClass(a) {
    cout << "Derived class constructor called" << endl;
    this->a_private = a;
}

ma​​in.cpp

#include "BaseClass.h"
#include "Derived.h"

int main() {
    Derived d(2);

    return 0;
}

使用命令编译 g++ main.cpp Derived.cpp BaseClass.cpp 运行会得到如下输出

Base class constructor called
Derived class constructor called

正如 cmets 中提到的(信用@IgorTandetnik),初始化列表应该只在实现文件中使用。不在头文件中(前提是类没有模板化)。

【讨论】:

    猜你喜欢
    • 2019-11-28
    • 1970-01-01
    • 2011-03-12
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2015-03-15
    相关资源
    最近更新 更多