2016-06-19 5 views
-3

Edit:Невозможно создать экземпляр класса (конструктор не по умолчанию)

Я нашел решение самостоятельно. Прошу прощения за этот вопрос, который для вас не был полностью недостаточным.

Okey, у меня так много кода в моей программе. Я пишу дерево с использованием списка, который я напишу. Я не могу использовать библиотеку STL.

30_Contaner.h:

#pragma once 
#include "Container_5_30.h" 
#include "Tree.h" 
#include "List.h" 


using std::cout; 
using std::cin; 


class Tree : public AbstractTree 
{//Cathy 
protected: 

    struct ListStruct{ 
     void* key; 
     size_t size; 
     ListStruct* next; 
    }; 

    //Iterator *globalIterator; 

    class List : public AbstractList{ 
    public: 

     /*some code*/ 

     List(MemoryManager& mem) :AbstractList(mem){//constructor 

     } 

     virtual ~List(){ 

     } 

     //some functions 
    }; 

    struct TreeStruct{ 
     TreeStruct *parent; 
     //OneLinkedList* Children = new OneLinkedList; 
     List *Children;//error 
     void *elem; 
     size_t size; 
     int childIndex; 
    }; 


    int numberOfElements; 
    bool globalBoolForRecursion; 
    //TreeStruct *TreeStructInstance = new TreeStruct; 
    List *ListInstance = new List;//error 


public: 

    Tree(MemoryManager& mem) :AbstractTree(mem) { 
     //root = new TreeStruct;//root - корень дерева (элемент структуры Дерева) 
     numberOfElements = 0;//кол-во элементов в дереве пока что 0 
    } 

//some functions 

}; 

main.cpp:

#include "30_Container.h" 
#include "30_Mem.h" 
#include "Tree.h" 



//******************************** 

    void main(){ 


     Mem mem(100); 

     Tree tree(mem); 

     //some code 
    } 

30_Mem.h

#pragma once 
#include "MemoryManager.h" 

// Простейший менеджер памяти, использует ::new и ::delete 

    class Mem : public MemoryManager 
    { 
    public: 
     Mem(size_t sz) :MemoryManager(sz) {} 

     void* allocMem(size_t sz) { return new char[sz]; } 

     void freeMem(void* ptr) { delete[] ptr; } 
    }; 

Все методы AbstractTree, MemoryManager и AbstractList классов являются виртуальными. Я должен получить экземпляр класса List внутри класса Tree. Но у меня есть проблема: у меня нет конструктора по умолчанию для List и, конечно, когда я пишу List *list = new List; У меня есть ошибка. Мой учитель сказал мне, что я должен использовать указатель на менеджер памяти дерева или адрес, может быть. Есть ли у вас какие-либо идеи? P.S. Мне нужно 30_Mem.h в будущем. Я должен писать мой собственный new

ответ

1

Вместо инициализации по умолчанию для ListInstance добавить инициализации ListInstance конструктору

Tree(MemoryManager& mem) :AbstractTree(mem), ListInstance(mem) { 
    //root = new TreeStruct;//root - корень дерева (элемент структуры Дерева) 
    numberOfElements = 0;//кол-во элементов в дереве пока что 0 
} 
+0

, если я хочу сделать в любой из функций класса Tree этого: 'tree-> Дети = новый список ; 'Что делать с' new List', если нет конструктора по умолчанию? – Catalina

+0

Если мне нужно в определенной функции класса выделить память для 'List * Children;' из картин 'TreeStruct', как мне это сделать, если нет конструктора по умолчанию. Я же не могу конструктор класса дерево вызвать. – Catalina

+0

'List * list = new List (this -> _ memory); '(' _memory' из класса Abstract в Container.h). Ваше решение работает только в том случае, если я объявляю экземпляр перед конструктором, но для меня это действительно необходимая информация. Спасибо))) Просто мою программу надо видеть, чтобы полностью понять, что именно я хотела узнать – Catalina

Смежные вопросы