Member 12652642 Ответов: 4

Создать виртуальные классы в основной


Привет,

Предположим, у меня есть отдельный заголовочный файл с соответствующим файлом .cpp. Обычно, если бы я хотел сделать это с обычным классом, чтобы создать его экземпляр в main, это было бы сделано:

Class object;


Это не работает с виртуальными классами, я это очень хорошо понимаю. Несмотря на чтение, я все еще не уверен на 100 процентов, почему.

Использование указателя тоже не работает, как и выполнение
Class *object;


Однако:
Class *object();
исполняет. Почему это? Работает ли он так, как задумано?

Что я уже пробовал:

Все, о чем говорилось выше. Я новичок в C++ и еще более экологичен, когда дело доходит до использования двух отдельных файлов для классов (любой учебник, который хорошо объясняет это, был бы полезен). Бросая в виртуальное, смущает меня еще больше.

4 Ответов

Рейтинг:
2

Stefan_Lang

Привет

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

Вот приличный учебник по Cplusplus.com, который также является хорошим справочным сайтом для расширенных языковых функций: Учебник по языку C++

Что касается ваших вопросов:
1. класс, который имеет один или несколько чистый виртуальные функции не могут быть созданы. Это то, что называется (Чистым) виртуальным, или "абстрактным" классом. Обычно вы используете такие классы, если все, что вы хотите сделать, это описать конкретное поведение, а не все определение реального класса, или если вы хотите описать поведение, которое является общим для нескольких связанных классов.

Пример:

// file Shape.h

// class Shape describes some geometric object
// it may be drawn, but how to draw a shape depends on the specific type of shape
// therefore we define this class as pure virtual, and leave the drawing to the
// concrete shape classes:
class Shape {
public:
   virtual void draw() = 0; // pure virtual or 'abstract' member function
};

// file Triangle.h

#include "Shape.h" // read declaration of the base class Shape

// class triangle
class Triangle : public Shape {
public:
   virtual void draw(); // this function will draw a triangle
};

// file Triangle.cpp

#include "Triangle.h"

// implementation of the Triangle member functions
void Triangle::draw() {
   // draw some triangle here ...
}

(а теперь сделайте то же самое для других типов фигур, например круга, квадрата)
// file main.cpp

#include "Shape.h"
#include "Triangle.h"
#include "Circle.h"
#include "Square.h"

int main() {
   Shape* shapes[3];
   // construct the shape objects
   shapes[0] = new Triangle();
   shapes[1] = new Square();
   shapes[2] = new Circle();

   // now draw all shapes:
   for (int i = 0; i < 3; ++i) {
      shapes[i].draw();
   }

   // destroy the constructed objects again
   for (int i = 0; i < 3; ++i) {
      delete shapes[i];
   }

   return 0;
}

Теперь, если бы вы могли создать экземпляр объекта класса Shape и назначьте его своему shapes массив, как вы думаете, к чему призыв draw() подойдет? - Ты не знаешь? Ну, и компилятор тоже. Вот почему это запрещено.

(остальные вопросы в отдельном решении))


Рейтинг:
2

KarstenK

Ключевое слово virtual означает, что вы не можете создать экземпляр класса. Это правило в языке C++. Виртуальные классы часто используются в качестве базового класса для определения некоторого поведения, которое реализуется в другом классе.
Если вы хотите использовать класс в другом файле, вы должны включить заголовок:

#inlcude "class1.h"//

Для использования указателя вы также должны создать объект и удалить его в конце.
Class *object = new Class();//create instance
object->DoSomething();//call a function
delete object;// destroy it

Ницца руководство.


Рейтинг:
1

Stefan_Lang

2. в следующей строке объявляется только переменная, которая может содержать адрес объекта класса Class:

Class *object;

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

3. следующая строка объявляет только функцию, которая не принимает аргументов и возвращает указатель на объект типа Class:
Class *object();

Обратите внимание, что конечные скобки представляют собой допустимый список аргументов функции, и поэтому компилятор интерпретирует object как имя функции, которая имеет пустой список аргументов.

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


Рейтинг:
1

CPallini

Цитата:
Я новичок в C++ и еще более экологичен, когда дело доходит до использования двух отдельных файлов для классов

Тогда пришло время учиться. вы должны быть очень уверены в себе. C++ модель компиляции. Смотрите, например: 1.9-заголовочные файлы " Learn C++[^].



Цитата:
Бросая в виртуальное, смущает меня еще больше.

Виртуальные (абстрактные) классы находят свое применение в полиморфизме. В настоящее время полиморфизм является одним из столпов OOP и вы должны выучить его, чтобы правильно писать C++ объектно-ориентированный код. Смотрите, например: Полиморфизм-Учебники По C++ [^].