2015-10-08 7 views
1

Я пытаюсь написать код в C++ (для OpenFOAM), но я получаю сообщение об ошибке, данное в названии для этого бита кода:C++ - Невозможно объявить переменную быть абстрактного типа

// Copy set 
void backup 
(
    const polyMesh& mesh, 
    const word& fromName, 
    const topoSet& fromSet, 
    const word& toName 
) 
{ 
    Info<< "Backing up " << fromName << " into " << toName << endl; 

    topoSet backupSet(mesh, toName, fromSet); 

    backupSet.write(); 
} 

полная ошибка:

faceSet.C:51:18: error: cannot declare variable ‘backupSet’ to be of abstract type ‘Foam::topoSet’ 

ошибка в этой строке:

topoSet backupSet(mesh, toName, fromSet); 

глядя этого, я думаю, я понимаю, что, может быть, topoSet ш ould будет объявлен как константа, но я пробовал это, и это не имело никакого значения.

У меня есть несколько ошибок подобного характера, но я просто пытаюсь понять, как исправить это.

+0

Хорошо, это несколько сотен строк, и я не уверен, какая часть из них будет лучше всего включить, поэтому я могу как-то отправить его как файл? Есть ли способ сделать это? – user3460758

+0

Нет, нет. Предполагается, что вы построите [минимальный тестовый файл] (http://stackoverflow.com/help/mcve), по крайней мере частично, потому что это должно было быть одним из ваших первых шагов отладки с запросом на интернет. –

+1

Не знаете, как вы пришли к «возможно, должны быть объявлены как константа» от исследования абстрактных классов! –

ответ

0

Вы не можете использовать topoSet backupSet;, так как это было бы попыткой создать экземпляр topoSet, который вы не можете сделать как абстрактное.

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

topoSet* backupSet = new foo(/*ToDo - parameters*/)

или экземпляр каталога foo backupSet(/*ToDo - parameters, omit the parentheses if there are no parameters*/).

2

Вы не можете создать экземпляр topoSet, потому что это абстрактный класс, содержащий виртуальные нереализованные методы (maxSize(), кажется, один из них). Даже если бы не было реализованных (чистых виртуальных) членов, создание экземпляра topoSet было бы неправильным, поскольку вы потеряли бы всю информацию о том, что было исходным типом fromSet, и все данные, которые у него были выше topoSet (это сродни до slicing).

Я думаю, что вы должны использовать один из topoSet::New() статических функций (названные конструкторы), или, если все, что вам нужно сделать, это сохранить его под другим именем, а затем просто дважды использовать topoSet::rename() (на самом деле regIOobject::rename()).