Я переписал ваш класс немного
#include <iostream>
#include <vector>
class base_class {
private:
double a_, b_;
public:
//base_class(){};
base_class(double a, double b) : a_(a), b_(b) {}
virtual ~base_class();
};
class derived_class : public base_class {
private:
std::vector<base_class> vector_object;
public:
explicit derived_class(int dim) : base_class(0, 1) {
vector_object.push_back(static_cast<base_class>(*this));
}
~derived_class();
std::vector<base_class> get_vector_object() const { return vector_object; }
};
int main() {
int dim = 3;
derived_class abc(3);
std::cout << abc.get_vector_object().size() << std::endl;
return 0;
}
Это создает и компилирует правильно.Было внесено несколько изменений: я использовал список инициализаторов элементов конструкторов, где это применимо, я добавил виртуальный деструктор в ваш базовый класс; каждый раз, когда вы наследуете базовый класс, должен иметь виртуальный деструктор, я переместил все частные переменные-члены в начало класса, а не внизу, я префикс конструктора производного класса с явным ключевым словом, так как у вас есть только один параметр, переданный в него , Я изменил конструктор output_class, чтобы использовать конструктор base_class в списке инициализации его члена, и я заполнил его вектор-переменную-член внутри конструктора, используя метод push_back(), и статически лидировал разыменованный этот указатель на тип base_class, и я также изменил метод print_vector_object на просто get_vector_object, поскольку он ничего не печатает и возвращает вектор-член из класса. Я также объявлял этот метод как const, чтобы он не менял класс, поскольку вы только извлекаете его. Единственный вопрос, который у меня есть, - это то, что делает параметр int
в производном_классе? Он не используется ни в одном месте, и у вас нет переменной-члена для его сохранения.
В этом разделе вашего производного класса здесь
public: derived_class(int dim): vector_object(dim, base_class(0,1)){};
где вы объявляете ваш конструктор не делает никакого смысла для меня.
Похоже, что вы пытаетесь использовать список инициализации членов, чтобы заполнить вашу переменную-член вектора, передав в переданный параметр вашего производного класса и вызвав конструктор в ваш базовый класс со значениями {0,1}. Это не будет работать так, как вы ожидали. Сначала вам нужно создать объект Base Class, который является под-объектом для этого производного класса, чем в области функций вашего конструктора, который вы можете заполнить своим вектором-членом.
У вас возникнет проблема, потому что у вас нет конструктора по умолчанию, который доступен для создания и создания производного типа. Поскольку из того, что я могу собрать на том, что вы показали и что кажется, что вы пытаетесь сделать, кажется, что вы хотите, чтобы base_class инициализировался до {0,1}, когда вызывается производный конструктор; если это так, вы можете просто вызвать свой реализованный конструктор для base_class с {0,1}, переданный в его конструкторе, в то время как ваш производный тип пытается построить. Это позволит правильно сформировать производный класс, поскольку base_class был сконструирован. Теперь, когда вы можете начать создание своего производного типа, похоже, что вы хотите сохранить сконструированный base_class в переменную-член вектора производных типов. Вот почему я делаю это внутри конструктора, а не в списке инициализации, и я push_back - экземпляр производного типа, который статически возвращается к базовому типу с использованием разыменованного этого указателя. Также, когда я устанавливаю точку прерывания в основной функции, где вы пытаетесь напечатать свой размер, и я смотрю на переменную-член производного класса, она заполняется 1 объектом, который имеет значения a = 0 и b = 1. Чтобы иметь возможность печатать вам нужно добавить public get методы для возврата каждой переменной. Кроме того, если параметр int в производном классе не нужен, вы можете удалить его вместе с явным ключевым словом. Кроме того, можно реализовать второй конструктор производного типа, который принимает в двух дублей так же, как основание делает и передать эти параметры из конструктора derived_class конструктору base_class, как это:
public:
derived_class(double a, double b) : base_class(a, b) {
vector_object.push_back(static_cast<base_class>(*this));
}
Я продемонстрировать простой пример базовый и два производных класса, где первый экземпляр должен будет устанавливать значения при построении, а второй должен будет использовать свой собственный конструктор, где нет конструктора по умолчанию, который определен в базовом классе.
class Base {
private:
double x_, y_, z_;
public:
Base(double x, double y, double z);
virtual ~Base();
};
Base::Base() :
x_(x), y_(x), z_(z) {
}
Base::~Base() {
}
class DerivedA : public Base {
private:
int value_;
public:
explicit DerivedA(int value);
~DerivedA();
};
// In This Case A Must Set The Values In The Constructor Itself: I'll Just
// Set Them To (0, 0, 0) To Keep It Simple
DerivedA::DerivedA(int value) :
Base(0, 0, 0),
value_(value) {
}
DerivedA::~DerivedA() {
}
class DerivedB : public Base {
private:
int value_;
public:
DerivedB(int value, double x, double y, double z);
~DerivedB();
};
// In This Case B Doesn't Have To Know What Is Needed To Construct Base
// Since Its Constructor Expects Values From Its Caller And They Can
// Be Passed Off To The Base Class Constructor
DerivedB::DerivedB(int value, double x, double y, double z) :
Base(x, y, z),
value_(value) {
}
DerivedB::~DerivedB() {
}
Дайте мне знать, если это поможет вам!
Я не уверен, что «векторная версия» - это разумная вещь, которую нужно хотеть. –
@ KerrekSB, я знаю, и, как указано в ответах ниже, моя жизнь была бы легче, если бы не так.Но, пожалуйста, предположите, что я хочу определить векторизованный производный класс и сосредоточиться на причине, почему мой пример не работает. –