分段错误 - 分配类困难

Segmentation Fault - Difficulty with assigning a class

本文关键字:分配 错误 分段      更新时间:2023-10-16

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

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

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

附言我知道我正在添加"字典.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 << "Hellonn";
DictObj * d;
d->load();
return 0;
}

这是字典.cpp

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

这在运行该方法时给了我一个分段错误:

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

代码继续,但错误在"setW(temp)">

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

法典:

int main() {
cout << "Hellonn";
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; 
};

您的第一个版本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;
}

毕竟是无用的。

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

嘭嘭。

我的愚蠢。

我想要吸取的教训是,在创建新对象时,永远不要在构造函数中的类中定义您的类。

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