如何创建新对象并将其分配给c ++循环中的指针变量

时间:2016-12-22 12:47:45

标签: c++ pointers object

我是C ++的新手,我不明白是什么原因引起了我的问题以及如何解决它。基本上,我正在尝试创建一个包含对象的结构堆栈,但程序一直给我提出我不理解但无法解决的问题。任何暗示我应该做什么将非常感激。我当前的错误是:error: cannot convert ‘Telefon’ to ‘Telefon*’ in assignment

class Telefon {
    public:
        Telefon() : cena(0.0), model(NULL), producent(NULL) {}
        double cena;
        string model;
        string producent;
    Telefon(double a, string b, string c) {
    cena=a;
    model=b;
    producent = c;
        }
};


Telefon* buildTelefon() {
   double cena;
   string model, producent;
   std::cout<< "podaj cene telefonu: " << std::endl;
   std::cin >> cena;
   std::cout<< "podaj model telefonu: " << std::endl;
   std::cin >> model;
   std::cout<< "podaj producenta telefonu: " << std::endl;
   std::cin >> producent;
   Telefon *tel = new Telefon();
   tel = Telefon(cena, model, producent);
   return tel;

}


class StackLinkedList
{
  private:
  struct Node
{
    Telefon telefon;
    struct Node *ptrToNext;
};

  public:
         struct Node *first;
      StackLinkedList(){first = NULL;}
      void push(Telefon&);
};

void StackLinkedList::push(Telefon& telefon_)
{
    Node *oldfirst = first;
    Node *temp = new Node();
    temp->telefon = telefon_;
    temp->ptrToNext = oldfirst;
    first = temp;
}

int main () {
    int n;
    std::cout << "stacks length: "<< endl;
    cin >> n;
    StackLinkedList myStack = StackLinkedList();
    for (int i = 0; i < n; i++){
        Telefon *telefon = buildTelefon();
        myStack.push(*telefon);
    }
}

1 个答案:

答案 0 :(得分:1)

我怀疑你应该替换

Telefon *tel = new Telefon();
tel = Telefon(cena, model, producent);

Telefon *tel = new Telefon(cena, model, producent);

甚至更好(在更多genuine C ++ 11中)。

auto tel = new Telefon(cena, model, producent);

但你应该花几天的时间在Programming - Principles and practice using C++上阅读一本好书并查看C++ reference你不理解的任何内容。

你的代码看起来很麻烦,闻起来很糟糕。详细了解标准containerssmart pointers。请务必至少为C ++ 11编写代码(因此NULL错误,或至少非常糟糕;请使用nullptr)。

不要忘记编译所有警告&amp;调试信息(例如,如果使用最近的 GCC编译器,则为g++ -Wall -Wextra -g)。改进您的代码,直到您没有警告。然后使用调试器gdb),特别是逐步运行程序(并查询程序状态)。

PS。如果您的编译器不支持C ++ 11,则应升级或更改编译器。 C ++ 11标准对w.r.t有很多改进。像C ++ 03这样的旧标准,你不应该浪费时间学习比C ++更老的东西。