Возможно, это не решается, но что если да?
Код в общих чертах:
#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: исправил глупости, написанные второпях
Напишите for (auto m : v)
и не мучайтесь... Вам же не нужна ссылка на указатель. А если нужна ссылка, то пишите правильно:
for (auto& m : v)
Обратите внимание на местоположение &
Не абстрактность класса выползет только при линковке, она к самой компиляции в полной мере ни при чем. Вот скрины для тех, кто считает, что проблема в не абстрактности Base
:
Сделайте базовый класс абстрактным
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 способа)
Проблема оказалась до очевидного проста. На самом деле, в том примере, что у меня сейчас не должно быть ошибок - ошибка была В ДРУГОМ ОБЪЕКТЕ, хотя красной волнистой линией подчёркивался именно этот объект.
придумал вот как и это работаетно видимо сокет ждет 30 секунд, а потом обрывает связь
Есть код для деления чисел на наибольший общий множитель: