【问题标题】:Help with Pointers, pointers to objects, and classes指针、对象指针和类的帮助
【发布时间】:2010-11-14 16:54:40
【问题描述】:

我正在寻找正确的方向。 我有 1 个班级活动

class Event{
private:
 vector<string> Question;
 char Mode;// 1 = Ascending 2 = Descending 3 = None
 string EventName;
public:
    Event(string Name){
        EventName = Name;
        SetQuestionSize();
        SetQuestion();
        Mode = 3; 
    }

    void SetName(string NewName){
        EventName = NewName;
    }
    void SetQuestionSize(){
        Question.resize(15);
    }

    int ReturnQuestionSize(){
        return Question.size();
    }

    void SetQuestion(){
        Question[0]="Enter ";
        Question[1]="1 ";
        Question[2]="to ";
        Question[3]="sort ";
        Question[4]="in ";
        Question[5]="ascending ";
        Question[6]="order, ";
        Question[7]="2 ";
        Question[8]="for ";
        Question[9]="Descending, ";
        Question[10]="or ";
        Question[11]="3 ";
        Question[12]="to ";
        Question[13]="ignore ";
        Question[14]=EventName;
    }

    string ReturnQuestion(int Index){
        return Question[Index];
    }

    /*vector<string> ReturnQuestion(){
 return Question;
    }*/

    void SetMode(char NewMode){
 if (NewMode == '0' || NewMode == '1' || NewMode == '2')
 Mode = NewMode;
}

    char ReturnMode(){
 return Mode;
    }

    string ReturnName(){
        return EventName;
    }
};

这将是第二个对象的成员,它将使用 Event 的函数将数据存储在 Event 的成员中。

我遇到的问题是在我的第二个对象中声明一个 Event 对象数组。在研究时,我遇到了使用指向第一个对象的指针数组的方法,而我猜想的一些运算符“->”与虚函数有关。

class WhatTheyWant{
    Event *events[2];
public:
    WhatTheyWant(){
        events[0]= new Event("Miss");
        events[1]= new Event("Dodge");
    }
};

我对指针一无所知,我知道我最终将不得不学习它们,但它们是最好的方法还是有更好的方法。

【问题讨论】:

  • 我不确定网站的格式,但假设事件包括矢量和字符串库,而 WhatTheyWant 包括事件

标签: c++ arrays oop class pointers


【解决方案1】:

由于您的Event 类没有默认构造函数,因此您需要使用其名称显式构造每个对象,因此您当前的操作方式是唯一的方法。

如果你给Event添加一个默认构造函数,你至少可以通过其他两种方式来实现:

如果你总是有一个(小)固定数量的对象,你可以声明一个恒定大小的数组:

Event events[2];

这样做会在创建WhatTheyWant时自动构造对象,所以你只需要在之后设置名称:

WhatTheyWant() {
  events[0].SetName("Miss");
  events[1].SetName("Dodge");
}

如果你想拥有可变数量的事件,你可以声明一个指针并动态分配一个对象数组:

Event *events;

您可能可以将数字作为参数提供给构造函数:

WhatTheyWant(int numEvents) {
  events = new Event[numEvents];
  for (int i = 0; i < numEvents; i++)
    events[i]->SetName("...");
}

此外,与您的问题没有直接关系,但您的 Mode 变量最好使用枚举而不是 char 进行建模。使用 enum 可以更清楚地了解变量的真正含义,而不是使用 0、1 和 2 之类的值。例如:

public:
  enum ModeType { Ascending, Descending, None };
private:
  ModeType Mode;
public:
  Event() {
    ...
    Mode = Ascending;
  }
  void SetMode(ModeType NewMode) {
    Mode = NewMode;
  }
  ModeType ReturnMode() {
    return Mode;
  }

【讨论】:

  • 谢谢 我现在正在查找枚举。如果我想创建作用于第二个对象 WhatTheyWant 的第三个对象,我是否必须向 WhatTheyWant 添加 mutator 和访问函数?这些 mutator 和 accessor 函数主要是访问 Event 的 mutator 和 accessor 函数,对吗?
  • @Malaken:是的,可能。同样,这取决于您要做什么。
【解决方案2】:

您可以使用对象数组或指针数组。

对象数组如下所示。

class WhatTheyWant{ 
    Event events[2]; 
public: 
    WhatTheyWant()
    { 
       events[0] = Event("Miss");
       events[1] = Event("Dodge");
    } 
 }; 

注意:您需要在事件类中添加默认构造函数才能编译上述方法。

使用上述方法,您无需关心释放 Event 对象。每当 WhatTheyWant 对象被销毁时,事件对象就会被销毁。

指针数组方法就像你提到的那样。

但是您需要注意释放分配的内存(除非您使用 auto_ptr 或某些 c++0x 等效项)。 删除应该发生在如下的析构函数中。

class WhatTheyWant{ 
    Event *events[2]; 
public: 
    WhatTheyWant(){ 
        events[0]= new Event("Miss"); 
        events[1]= new Event("Dodge"); 
    } 
    ~WhatTheyWant()
    {
        delete events[0];
        delete events[1];
    }
};

【讨论】:

  • 谢谢,我将更改 Event 类的默认构造函数,并尝试使用对象数组,并在类名使其成为析构函数之前让大家知道我猜的结果?
  • @Malaken:是的,它是析构函数的语法。
【解决方案3】:

在 C++ 中,指针就像数组一样

在您的 WhatTheyWant 类中,您定义私有成员:

Event *events[2];

这是一个数组数组(二维数组),长度可变(数组),每个数组有 2 个元素。

当你想访问一个(某种对象的成员)并且称为对象指针(指向一个对象的指针)但是当你定义一个普通的对象变量时使用运算符'->'你用 '。'运算符。

如果你有勇气和知识使用它们,它们会非常有用,但总的来说它们很危险,这就是为什么新语言倾向于采用托管方式的原因。

【讨论】:

  • -1:这是一篇充满刻板印象和都市神话的帖子。指针真的不只是像数组。而且一般来说它们并不危险。
  • 感谢您的解释。 “这是一个数组数组(二维数组),长度可变(数组),每个数组中有 2 个元素。”加上这个例子帮助了一个我以前无法理解的信息点击。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-09
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多