实例化指向派生类的const指针

时间:2019-07-16 18:07:44

标签: c++ constructor polymorphism

我有一个抽象基类Base,其中包含指向另一个抽象基类BaseDataClass的指针。我已经为这两个类派生了类,我将它们分别称为DerivedDerivedDataClassBase不知道存在DerivedDataClass,无论如何,我打算以后再使用BaseBaseDataClass子类的多个组合。在派生类中,我希望将指针设置为派生数据类的实例,但是我不希望以后意外地分配指针,所以我将其设置为const。显然,这使我无法在派生类的构造函数中使用new分配指针。有一种巧妙的方法可以在保持指针const的同时完成此操作吗?

class BaseDataClass
{
public:
    BaseDataClass(){}
    //some pure virtual methods
};

class Base
{
public:
    Base(){}
    //some pure virtual methods

protected:
    BaseDataClass * const data; //compiler complains if this isn't set

};



//// elsewhere
class DerivedDataClass : public BaseDataClass
{
public:
    DerivedDataClass(){}
};


class Derived : public Base
{
public:
    Derived(){
        data = new DerivedDataClass(); //also does not compile obviously
    }

};

1 个答案:

答案 0 :(得分:1)

不能将常量对象分配给它。您必须在初始化时设置const成员的值。如果初始化为null,则它将始终为null。因此,请勿初始化为null。为了让派生类选择初始化它的对象,请使用构造函数参数:

import { Component } from '@angular/core';
import {  NavController, NavParams } from 'ionic-angular';
import { AngularFireDatabaseModule } from 'angularfire2/database';

@Component({
  selector: 'page-chat',
  templateUrl: 'chat.html',
})
export class ChatPage {
  username: string=''
  message: string=''

  constructor(public navCtrl: NavController, public navParams: NavParams,
    public db: AngularFireDatabaseModule
    ) {
      this.username = this.navParams.get('username')
  }

  ionViewDidLoad() {
    this.db.list('/chats').push({
     username: this.username,
     message: this.message
    })

    console.log(this.navParams);
  }

}

您可以使用该参数初始化成员。


说:

  • 如果在构造函数中使用Base::Base(BaseDataClass *); ,则应确保最终删除它,否则会泄漏内存。
  • 您无法通过指向base的指针进行删除,因为base的析构函数不是虚拟的。
  • 光秃秃的拥有指针是一个错误的设计。您应该改用智能指针。