分段错误 - 分配类很难

时间:2017-04-01 21:36:50

标签: c++ dictionary artificial-intelligence c++14

我正在尝试分配我的类DictObj来创建该类的新实例。它想要做的是,有一个指向所创建的类的指针,而不是实际的Object。

如果我愿意做它喜欢的事,并且: DictObj * d;,然后说出" d->load();",它给字符串分配字符串时遇到了困难。例如,假设word是stringword = a;,其中a也是作为相同类型的参数传递的字符串(没有指针或引用)。当我这样做时,它给了我一个分段错误。

有关如何解决此问题的任何建议?下面,我将展示代码示例:

P.S。我知道我正在添加" Dicts.cpp",即使我不应该这样做。它给了我一个错误

  

/tmp/ccEFPwDS.o:在功能' main':   /home/courtneymaroney/Desktop/Courtney/Documents/AI/NEW/main.cpp:60:对DictObj::load()的未定义引用

实际代码:

#include<iostream>
#include<iomanip>
#include<vector>
#include<string>
#include<thread>
#include<cassert>
#include<exception>
#include"Directory.hpp"
#include"Dicts.cpp"
#include"Tests.hpp"

int main() {
  cout << "Hello\n\n";
  DictObj * d;
  d->load();
  return 0;
}

这是Dicts.cpp

void DictObj::setW(string a)
{
    word = a;
}

这在运行方法时给出了分段错误:

void DictObj::load()
{
    string temp;
    cout <<"Type New Word: ";
    getline(cin, temp);
    cin >> temp;

    setW(temp);

代码继续,但错误在&#34; setW(temp)&#34;

如果我按照预期尝试在主类中创建一个新的DictObj,那么它会给我一个错误

代码:

int main() {
    cout << "Hello\n\n";
    DictObj d = new DictObj();
    d.load();
    return 0;
}

错误:

g++ -std=c++14 -Wall -c "main.cpp" (in directory:         /home/courtneymaroney/Desktop/Courtney/Documents/AI/NEW)
main.cpp: In function ‘int main()’:
main.cpp:59:26: error: conversion from ‘DictObj*’ to non-scalar type     ‘DictObj’ requested
  DictObj d = new DictObj();
                      ^
Compilation failed.

另外:我的编译代码如下(我正在使用Geany)

g++ -std=c++14 -Wall -c "%f"

我的构建代码如下:

g++ -g -std=c++14 -Wall -Wextra -pedantic -lpthread -o "%e" "%f"

DictObj类的定义:

class DictObj
{
    public:
       DictObj();
       DictObj(const DictObj&);
       void load();
       void setW(string);
   private:
       string word; 
};

2 个答案:

答案 0 :(得分:0)

您的第一个版本DictObj * d; d->load();崩溃,因为您取消引用了未初始化的指针d。因此,由于d未指向有效对象,d->load()将导致未定义的行为(并且最有可能发生崩溃)。

您的第二个版本根本无法编译,因为您将指针值分配给对象值。写下DictObj* d = new DictObj(); d->load()DictObj d; d.load()

请参阅以下代码,该代码编译并且不会崩溃:

#include <iostream>

using std::string;

class DictObj
{
public:
    DictObj() {};
    DictObj(const DictObj&);
    void load() {
        string temp;
        std::cout <<"Type New Word: ";
        getline(std::cin, temp);
        std::cin >> temp;
        setW(temp);
    };
    void setW(string a)
        {
            word = a;
        };

private:
    string word;
};

int main(int argc, char* argv[]) {

    DictObj d;
    d.load();
    return 0;
}

答案 1 :(得分:0)

USUSESS QUSTION,AFTERALL。

我发现代码最可能的问题是我使用类定义来创建相同类定义的类定义。 I.E. 在类DictObj中,我在构造函数中定义了一个DictObj类型的变量。我将不得不重写类来分离矢量(大部分是它)和基础DictObj节点(非矢量)。

Boo hoo。

我的愚蠢。

我想要学到的教训是,在制造新物体时,永远不要在建造者的某个类别中定义你的课程。

至少我学到了宝贵的一课!