【问题标题】:C++ Constructor, Inheritance, Access Modifiers and StuffC++ 构造函数、继承、访问修饰符和其他东西
【发布时间】:2011-02-24 17:49:47
【问题描述】:
// Inheritance.cpp : main project file.
#include "stdafx.h"

using namespace System;

ref class Base {
private:
    int value;
    int value2;
    Base() { this->value2 = 4; }
protected:
    Base(int n) {
        Base(); // <- here is my problem
        value = n;
    }
    int get(){ return value; }
    int get2(){ return value2; }
};

ref class Derived : Base {
public:
    Derived(int n) : Base(n) { }
    void println(){
        Console::WriteLine(Convert::ToInt32(get()));
        Console::WriteLine(Convert::ToInt32(get2()));
    }
};

int main(array<System::String ^> ^args) {
    Derived ^obj = gcnew Derived(5);
    obj->println();
    Console::ReadLine();
}

控制台输出是:

0
5

我知道,我确实调用了 Base() 构造函数,并且我知道我创建了一个类似新对象的东西,它在 Base(int n) 被调用后消失了......

但我不知道如何将我的私有默认构造函数与受保护的构造函数结合起来。

(我通过visual-studio-2010使用.NET框架,但我认为这更像是一个一般的c++问题)

【问题讨论】:

  • 在 C++ 中不能从构造函数调用构造函数:stackoverflow.com/questions/308276/…
  • @birryee:当然可以——但这样做会构造 另一个 对象,而不是将当前对象的构造委托给另一个构造函数。
  • 是的,这正是我的问题:/

标签: .net visual-studio-2010 visual-c++ inheritance c++-cli


【解决方案1】:

当我遇到这种情况时,我添加了一个用于初始化公共值的成员函数,例如在两个构造函数上调用的 Init 方法。

【讨论】:

  • 啊,好吧,那似乎是最好的方法(尤其是在查看我的问题下方的第一条评论时)
【解决方案2】:

使用方法
例如,将此方法命名为init()

【讨论】:

    【解决方案3】:

    Base() 构造函数使 value 未初始化,我什至不确定是否需要构造函数,因为它是 private

    只需确保充分定义公共 API 并仅创建所需的构造函数即可。然后在每个构造函数中使用初始化列表来分配所有属性,以避免使用未初始化的内存(通常尽量避免在主体或单独的方法中分配以避免可能的双重初始化。

    【讨论】:

    • Base() 的目的是设置 value2,它是私有的,因为它的唯一目的是仅由同一类的其他构造函数调用,如本例中的 Base(int n),它可悲的是似乎不可能
    猜你喜欢
    • 2014-01-27
    • 2017-01-12
    • 2015-10-20
    • 2016-01-29
    • 2017-08-17
    • 1970-01-01
    • 2010-11-26
    • 2013-09-27
    相关资源
    最近更新 更多