определить список в заголовке вершины на C ++ - PullRequest
0 голосов
/ 11 января 2020

У меня проблема с определением синтаксиса List эта ошибка, которую я получаю, я пытался создать список Vertice, и у меня проблема с синтаксисом, я пытался использовать пространство имен STD также в заголовке, но все еще получаю ошибка: код серьезности Описание Ошибка состояния подавления строки файла проекта (активно) E0415 Нет подходящего конструктора для преобразования из "std :: list> *" в "std :: list>" graf C: \ Users \ danie \ OneDrive \ Desktop \ graf \ graf \ Vertice. cpp 39

enter image description here

Vertice.h

  #pragma once
  #include <list>
  #include <iostream>
  class Vertice {
  std::list<Vertice> getList();
  void setList(Vertice v);

  private:
    std::list<Vertice> *N;
   };

Vertice. cpp

#pragma once
#include <list>
#include <iostream>
#include "Vertice.h"

using namespace std;

Vertice::Vertice(int b, int f) {
  N = new list < Vertice > ();
  color = 0;
}

list < Vertice > Vertice::getList() {
  return  N;
}
void Vertice::setList(Vertice v) {
  this - > N - > push_front(v);
}
Vertice::~Vertice() {
  N - > clear();
}

1 Ответ

0 голосов
/ 11 января 2020

Причина, по которой вы получаете комментарии, а не ответы, заключается в том, что вы
a) не опубликовали сообщение об ошибке (как упомянуто в комментарии)
b) Ваш код содержит много ошибок и некоторые анти-паттерны.

При использовании пространств имен в C ++ принято использовать полное пространство имен в заголовке

std::list<Vertice> *N; // member declaration

и объявление "using" в модуле.

using namespace std;
...
list<Vertice> Vertice::getList() const // return by value, mark as const
{
    return N; // you don't need this->N in C++ 
}

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

Чего вы пытаетесь достичь с помощью этого кода? Я спрашиваю, потому что динамическое выделение "std :: list" немного странно. «Std :: list» предназначен для управления памятью, что делает этот код читаемым как «выделить указатель для хранения адреса памяти, которую я собираюсь выделить». Я сильно подозреваю, что вы пытаетесь создать рекурсивную структуру (дерево). Удивительно, но C ++ не требует от вас использования указателей для этого (C делает). Может быть, этот шаблон поможет?

class NTree
{
private:
  std::list<NTree> children;
};

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

class NTree
{
private:
  std::vector<std::unique_ptr<NTree>> children;
};

Это позволит вам, например, переместить дочерний элемент из одного узла (NTree) в другой ( NTree - или другое), безопасным способом. Это позволяет избежать любых затрат на копирование. Это незначительная экономия, если только ваши деревья не станут очень большими или не содержат очень большие объекты. Даже опытные программисты на C ++ попытаются заставить свой код работать, прежде чем пытаться выполнить такую ​​оптимизацию. Невозможно предсказать, будет ли это необходимо или нет, так что всегда тесты до и после.

...