【问题标题】:Is there a way to init/call CTOR in the .cpp?有没有办法在 .cpp 中初始化/调用 CTOR?
【发布时间】:2016-11-13 13:00:32
【问题描述】:

我在.h 中有这些指针声明对象:

ILFO *pLFOPianoRoll1, *pLFOPianoRoll2, *pLFOPianoRoll3;

我在.cpp 中使用:

pLFOPianoRoll1 = new ILFO(this, 8, 423, kParamIDPianoRollLFO1, 0);
pLFOPianoRoll2 = new ILFO(this, 8, 542, kParamIDPianoRollLFO1, 1);
pLFOPianoRoll3 = new ILFO(this, 8, 661, kParamIDPianoRollLFO1, 2);

但我想在这里避免使用指针(我了解到“如果您不需要它们,请不要使用它们”),并且只使用变量/类(由于稍后手动管理内存)。

但是我怎样才能清除 .h 中对象的变量(例如 ILFO mLFOPianoRoll1),而不是在 .cpp 上调用 CTOR?

【问题讨论】:

  • 这些成员是某个类还是全局变量?
  • 使用extern。顺便说一句,您为什么希望它们在头文件中公开?听起来一开始就是个错误的想法。
  • @barakmanos:我需要在已取消清除的类的每个部分访问该对象。
  • 那么这不是'INFO'类的标题吗?好的,既然如此,为什么不将这些变量声明为该头文件表示的任何类的成员?
  • 这就是我所做的。但我想在那里解除并稍后初始化(在班级的 CTOR 上)。

标签: c++ variables pointers object constructor


【解决方案1】:

您可以为此目的使用初始化列表。

#include <iostream>
#include <string>
using namespace std;

class A
{
public:
    A(int a_) : a(a_) { }

    void print() 
    {
        std::cout << "A: " << a << std::endl;
    }

    int a;
};

class B
{
public:
    B() : a(1), a2(3) {}
    A a;
    A a2;
};

int main() {
    B bObj;
    bObj.a.print();
    bObj.a2.print();
   return 0;
}

https://ideone.com/C7Vx1X

【讨论】:

  • 嗯,它看起来是我需要的。 1)所以 A a2 什么都不叫?还是默认 CTOR?
  • @paizza 在上面的代码中,B bObj; 正在调用 B::B() 构造函数。在 B 类构造函数中,我为成员 A a 和 A a2 调用类 A::A(int) 的构造函数。
  • 我明白了。但是“写”A a2 类的公众号B 其实是做什么的呢?什么都没有?
  • public 关键字将所有类方法和变量成员标记为在类范围之外可见。如果我将它们标记为私有,我将不得不使用 getter 或仅在 B 类方法中使用 A a A a2 变量。
  • :) 我的意思是,当它在代码的公共部分读取A a2 时,编译器会做什么?只需初始化一个调用其默认 CTOR 的 A 对象?
【解决方案2】:

为了简单地声明变量,请使用extern 关键字:

extern ILFO obj; //just declaration, no constructor is called.

在 .cpp 文件中

ILFO obj(blah, blah, blah); //definition

当然,如果您谈论的是命名空间范围(包括全局)变量。如果您在谈论类成员,那么您必须知道成员的构造函数直到类的构造函数才被调用。您可以将参数传递给constructor initialization list中的构造函数。

【讨论】:

  • 我的意思是:在一个类 A 中,我已经声明了 ILFO。我想从A 的所有部分访问ILFO。但我需要在A 的CTOR 内初始化ILFO。是不是更清楚了?
猜你喜欢
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 2021-02-26
  • 1970-01-01
  • 2018-01-13
  • 2019-08-29
  • 1970-01-01
相关资源
最近更新 更多