C ++ Наследование и Конструкторы - PullRequest
1 голос
/ 29 мая 2010

пытается понять, как использовать конструкторы с унаследованным классом. Я знаю, что это очень неправильно, я пишу на C ++ около трех дней, но в любом случае вот мой код:

clientData.h, два класса, ClientData расширяет сущность:

#pragma once

class Entity
{
public:
 int x, y, width, height, leftX, rightX, topY, bottomY;

 Entity(int x, int y, int width, int height);
 ~Entity();
};

class ClientData : public Entity
{
public:
 ClientData();
 ~ClientData();
};

и clientData.cpp, который содержит функции:

#include <iostream>
#include "clientData.h"
using namespace std;

Entity::Entity(int x, int y, int width, int height)
{
 this->x = x;
 this->y = y;
 this->width = width;
 this->height = height;

 this->leftX = x - (width/2);
 this->rightX = x + (width/2);
   this->topY = y - (height/2);
 this->bottomY = y + (height/2);
}

Entity::~Entity()
{
 cout << "Destructing.\n";
}

ClientData::ClientData()
{
 cout << "Client constructed.";
}

ClientData::~ClientData()
{
    cout << "Destructing.\n";
}

и, наконец, я создаю новую ClientData с:

ClientData * Data = new ClientData(32,32,32,16);

Теперь я не удивлен, что мой компилятор выдает мне ошибки, так как мне передать аргументы нужным классам?

Первая ошибка (из MVC2008) ошибка C2661: «ClientData :: ClientData»: ни одна из перегруженных функций не принимает 4 аргумента

и второе, которое всплывает, какие бы изменения я ни делал, ошибка C2512: «Entity»: нет подходящего конструктора по умолчанию Спасибо.

Ответы [ 6 ]

4 голосов
/ 29 мая 2010

В настоящее время конструктор для класса данных клиента не будет работать. Вам нужно будет создать конструктор для данных клиента, например:

ClientData(int x, int y, int width, int height): Entity(x, y, width, height)

если хотите позвонить

new ClientData(32,32,32,16);
3 голосов
/ 29 мая 2010

Первая точка

new ClientData(32,32,32,16);

не будет работать, так как единственный конструктор, который у вас есть для ClientData, не принимает аргументов. Конструкторы не наследуются в c ++, вам нужно снова определить конструктор.

class ClientData : Entity
{
   public:
   ClientData(int a,int b,int c,int d);
   //...
}

Второй вызывает конструктор базового класса. Обычно компилятор использует вызовы не аргументного конструктора базового класса, поскольку у Entity есть только конструктор, принимающий аргументы, это не удастся - вам нужно сделать явный вызов конструктора сущностей.

ClientData::ClientData(int a,int b, int c, int d)
: Entity(a,b,c,d)//Initializer list call base class constructor here
{
 //...
}
2 голосов
/ 29 мая 2010

Используйте инициализатор конструктора для инициализации баз и элементов:

struct Entity {
  int x, y, width, height, leftX, rightX, topY, bottomY;

  Entity(int x, int y, int width, int height);
};

Entity::Entity(int x, int y, int width, int height)
: x(x), y(y), width(width), height(height),
  leftX(x - (width / 2)), rightX(x + (width / 2)),
  topY(y - (height / 2))
{
  bottomY = y + (height / 2); // for members like leftX, rightX, topY,
  // and bottomY, assignment inside the ctor (instead of initialization)
  // can be appropriate
}


struct ClientData : Entity {
  ClientData();
  ClientData(int x, int y, int width, int height);
};

ClientData::ClientData() : Entity(0, 0, 0, 0) {}  // you may not even want a
// default ctor for this type

ClientData(int x, int y, int width, int height)
: Entity(x, y, width, height)
{}
1 голос
/ 29 мая 2010
0 голосов
/ 29 мая 2010

Я сделал некоторые изменения в вашем коде. Это может помочь вам немного о классах, членах и конструкторах C ++.

Когда вы используете унаследованные классы, вы должны вызывать конструктор базового класса с необходимыми параметрами для конструктора производного класса:

ClientData :: ClientData (int x, int y, int width, int height): объект (x, y, ширина, высота)

Просто мнение: не используйте имена параметров так же, как члены класса. Я обычно использую префикс «m_» перед учениками для легкой идентификации.

class Entity
{
public:
 int m_x, m_y, m_width, m_height, m_leftX, m_rightX, m_topY, m_bottomY;

 Entity(int x, int y, int width, int height);
 ~Entity();
};

class ClientData : public Entity
{
public:
 ClientData(int x, int y, int width, int height);
 ~ClientData();
};

Entity::Entity(int x, int y, int width, int height)
{
 m_x = x;
 m_y = y;
 m_width = width;
 m_height = height;

 m_leftX = x - (width/2);
 m_rightX = x + (width/2);
 m_topY = y - (height/2);
 m_bottomY = y + (height/2);
}

ClientData::ClientData(int x, int y, int width, int height) : Entity(x, y, width, height)
{
 cout << "Client constructed.";
}
0 голосов
/ 29 мая 2010

вы бы использовали список инициализаторов для вызова конструктора базового класса (примечание: его также можно использовать для вызова конструкторов объектов класса в объекте):

class Base
{
    private:
    int myVal;

    public:
    Base(int val)
    {
        myVal = val;
    }
};

class Heir : public Base
{
    private:
    std::string myName;

    public:
    Heir(std::string Name, int Val) : Base(Val)
    {
        myName = Name;
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...