Использование указателя на тип неполного класса не допускается, как быть?

298
09 июля 2022, 13:10

Возможно, это не решается, но что если да?

Код в общих чертах:

#include<iostream>
#include<vector>
class Base
{
public:
    virtual void f() = 0;
};
class A
    : public Base
{
public:
    void f() override 
    { 
        std::cout << "A";
    };
};
class B
    : public Base
{
public:
    void f() override
    { 
       std::cout << "B";
    };
};
int main()
{
    std::vector<Base*> v;
    v.push_back(new A());
    v.push_back(new B());
    for (auto& m : v)
    {
        m->f();   // Вот тут VS2019 ругается на неполный тип
    }
    return 0;
}

Есть ли какой-то рабочий аналог такого способа? Мне надо получить доступ к объектам ПОЛНЫХ КЛАССОВ, которые являются наследниками базового ВИРТУАЛЬНОГО класса

UPD: исправил глупости, написанные второпях

Answer 1

Напишите for (auto m : v) и не мучайтесь... Вам же не нужна ссылка на указатель. А если нужна ссылка, то пишите правильно:

for (auto& m : v)

Обратите внимание на местоположение &

Не абстрактность класса выползет только при линковке, она к самой компиляции в полной мере ни при чем. Вот скрины для тех, кто считает, что проблема в не абстрактности Base:

Answer 2

Сделайте базовый класс абстрактным

class Base
{
public:
    virtual void f() = 0;
};
class A
    : public Base
{
public:
    void f() { std::cout << "A" << std::endl; }
};
class B
    : public Base
{
public:
    void f() { std::cout << "B" << std::endl; }
};
int main(int argc, const char * argv[])
{
    std::vector<Base*> v;
    v.push_back(new A());
    v.push_back(new B());
    for (auto& m : v)
    {
        m->f();   // Вот тут VS2019 ругается на неполный тип
    }
    _getch();
}

а можно и не делать:

class Base
{
public:
    virtual void f() { std::cout << "Base" << std::endl; };
};
class A
    : public Base
{
public:
    void f() { std::cout << "A" << std::endl; }
};
class B
    : public Base
{
public:
    void f() { std::cout << "B" << std::endl; }
};

тоже будет работать

честно говоря вообще странно как ваш код пытался компилироваться - в нем куча ошибок было - подчистил код и все заработало (см. выше 2 способа)

Answer 3

Проблема оказалась до очевидного проста. На самом деле, в том примере, что у меня сейчас не должно быть ошибок - ошибка была В ДРУГОМ ОБЪЕКТЕ, хотя красной волнистой линией подчёркивался именно этот объект.

READ ALSO
Как это сделать в qt QTcpSocket и отдельный поток

Как это сделать в qt QTcpSocket и отдельный поток

придумал вот как и это работаетно видимо сокет ждет 30 секунд, а потом обрывает связь

215
Ошибка Floating point exception (core dumped)

Ошибка Floating point exception (core dumped)

Есть код для деления чисел на наибольший общий множитель:

220