相关疑难解决方法(0)

C++中的指针,多态和分段错误

我有一个有很多孩子的家长班.Parent类中的每个函数都是纯函数,即函数没有父实现,但子函数有自己的实现.无需在那里发布代码 - 标准的东西.

我不希望人们从任何地方创建父类的直接实例化.通过让虚拟功能保持纯净,我可以安全地防范这种情况.

我的问题:根据用户的输入(字符串),我想实例化其中一个孩子.我只知道运行时哪一个.我的(不正确的?)想法是以下编译好并且正常工作,直到我将代码放入函数并返回父级.

这样可行:

Parent* parent;
if(user_input == "A") {
    Child1 child1;
    parent = &child1;
}
else if(user_input == "B") {
    Child2 child2;
    parent = &child2;
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用:

Parent* foo(string user_input) {
    Parent* parent;
    if(user_input == "A") {
        Child1 child1;
        parent = &child1;
    }
    else if(user_input == "B") {
        Child2 child2;
        parent = &child2;
    }
   return parent;
}
Run Code Online (Sandbox Code Playgroud)

当我说它不起作用我的意思是,它编译但是当我这样做时我得到一个分段错误:

Parent* parent = foo(user_input);
parent->some_child_function(); // segmentation error here
Run Code Online (Sandbox Code Playgroud)

我确定这是一个关于我没有完全理解指针的愚蠢/简单的问题.在阅读了书籍/文章中的所有关于它们之后,我仍然不知道我做错了什么......它可能是一个单行修复?

谢谢 :).

c++ segmentation-fault

3
推荐指数
2
解决办法
632
查看次数

定义生成元素C++向量的函数时,正确的方法是什么

我必须在C++中定义一个函数,它生成一个类Foo的向量并返回它.

我可以用不同的方式定义它,它们都是完全相同的:

C样式参数传递:

void generateFooVector(vector<Foo> * result)
{
    for (int i = 0; i < 100; i++)
    {
        Foo f = Foo();
        result->push_back(f);
    }
}
int main()
{

    vector<Foo> result;
    generateFooVector(&result);
}
Run Code Online (Sandbox Code Playgroud)

参考传球:

void generateFooVector(vector<Foo> & result)
{
    for (int i = 0; i < 100; i++)
    {
        Foo f = Foo();
        result->push_back(f);
    }
}
int main()
{
    vector<Foo> result;
    generateFooVector(result);
}
Run Code Online (Sandbox Code Playgroud)

实例化向量并返回指针:

vector<Foo> * generateFooVector()
{
    vector<Foo> * result = new vector<Foo>();
    for (int i = 0; i < …
Run Code Online (Sandbox Code Playgroud)

c++ vector instance parameter-passing pass-by-reference

3
推荐指数
2
解决办法
117
查看次数

对于我编码的简单函数,会发生分段错误错误

这里我只想定义一个函数,它返回矩阵的乘法,N任意,我想生成一个带new命令的矩阵.当我执行该函数时,我得到错误:

Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

每当我分配值给C我有这个错误时,有人能告诉我发生了什么以及如何解决它?

int **multiply(int **A, int **B, int N){
    int **C = new int*[N];
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            for (int k = 0; k < N; k++)
                C[i][j] = C[i][j] + A[i][k] * B[k][j];
        }
    }
    return (C);
}
Run Code Online (Sandbox Code Playgroud)

c++

3
推荐指数
1
解决办法
104
查看次数

在C++中,以下代码如何工作?

可能重复:
类型名称后的括号是否与new有所不同?

以下代码执行哪些操作:

Test *t1 = new Test; // there is no () after new Test;
Run Code Online (Sandbox Code Playgroud)

如果有用户声明默认构造函数

那这个呢:

Test *t2 = new Test(); // there is () after new Test;
Run Code Online (Sandbox Code Playgroud)

c++

2
推荐指数
1
解决办法
180
查看次数

在C++中执行构造函数

构造函数的执行分两个阶段完成:

  1. 初始化阶段

  2. 正文执行阶段,由构造函数体内的所有语句组成.请注意,类型的数据成员始终在初始化阶段初始化,无论该成员是否在构造函数初始化列表中显式初始化.初始化发生在构造函数体的任何语句执行之前.

让我们考虑一种通过构造函数初始化类学生实例的方法-

Student(string &fn, string &ln, int i, int y = Freshman)
    : first_name(fn)
    , last_name(ln)
    , id(i)
    , year(y)
{}
Run Code Online (Sandbox Code Playgroud)

这是另一种,但"低效"和"不优雅"的做法 -

Student(string &fn, string &ln, int i, int y = Freshman)  
 {
     first_name = fn;
     last_name = ln;
     id = i;
     year = y; 
 }
Run Code Online (Sandbox Code Playgroud)

新代码中的此构造函数(上面的代码)分配类Student的成员.它没有明确初始化它们.是否存在显式初始值设定项,即使在执行构造函数之前,也会初始化first_name和last_name成员.此构造函数隐式使用默认字符串构造函数来初始化first_name和last_name成员.执行构造函数的主体时,first_name和last_name成员已具有值.这些值将被构造函数体内的赋值覆盖.

所以,这意味着当执行到达构造函数的开始括号时,这就是条件 -

  • 'first_name',这是一个字符串,通过调用默认的字符串构造函数(编译器' make ')来初始化.
  • 'last_name',这是一个字符串,通过调用默认的字符串构造函数(编译器' make ')来初始化.
  • "ID",它是一个整数未初始化.
  • "年",这是一个整数初始化.

现在,很明显,在构造函数的主体中对四个变量中的每个变量进行了赋值.

我对这件事的理解是对的吗?我不知何故觉得我错过了什么. …

c++ constructor

2
推荐指数
1
解决办法
598
查看次数

这些不同的对象结构有什么区别?

class A
{
public:
    int get(void){return stuff;}
    void set(int s){stuff = s;}

private:
    int stuff;
};

int _tmain(int argc, _TCHAR* argv[])
{
    A a;
    A b();
    A* ap = new A;
    A* bp = new A();
}
Run Code Online (Sandbox Code Playgroud)

我不知道main()中的四行之间的区别是什么,以及我可能使用哪一种与另一种(除了在堆栈或堆上)之间的区别.我注意到第四行实际上将"stuff"初始化为0,而其他行则没有.第二行似乎根本不是什么,这看起来很奇怪.

问题:每条线的权衡/含义是什么(在main()中)?是否使用parens对我来说很困惑.

c++ constructor

2
推荐指数
1
解决办法
137
查看次数

新的括号后存在,在C++ 11中有所不同

看看下面的两个声明.这两种方法在C++ 11中有什么不同?我在这里查看了关于C++ 03的故事

Class A{int m;}

  1. A* a = new A
  2. A* a = new A();

c++ c++11

2
推荐指数
1
解决办法
141
查看次数

c ++中的new运算符+默认构造函数

这里已经讨论了这个问题[链接] new []是否在C++中调用默认构造函数?

作为一个初学者和一个自学者,将赞赏积极的评论,请不要将其概括为广泛,狭隘等

当我们使用new []时,每个元素都由默认构造函数初始化,除非类型是内置类型.默认情况下,内置类型保持单一化.

这里有人说默认构造函数初始化对象是什么意思?是不是每个对象现在都将键初始化为零(由默认构造函数),因为当我打印p [2] .key时这是真的?

如何检查默认构造函数是否初始化数组或不是int数组,它无法访问main中的成员键?

另外(i)打印垃圾值,但(ii)打印0;

class People
{
    public:
      int key;
    People()
    {
        key=0;
    }
};

int main()
{
   int count=5;
   People *p=new People[count];
   cout<< p[2].key;

   // int *arr=new int[count]; ...(i)
   //cout<<*(arr+2);

  //int *arr=new int[count](); ... (ii)
 //cout<<*(arr+2)<<endl;

 return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++

2
推荐指数
1
解决办法
566
查看次数

这两个构造函数调用之间的区别

可能重复:
类型名称后的括号是否与new有所不同?

我相信这个问题已经被问到了,但我找不到快速搜索.

Foo ob* = new Foo; 

Foo ob* = new Foo();
Run Code Online (Sandbox Code Playgroud)

这两种在C++中创建对象的方法有区别吗?如果没有,那么其中一个被认为是不好的做法?每个编译器都会对它进行相同的处理吗?

c++ constructor

1
推荐指数
1
解决办法
283
查看次数

使用零初始化类成员

我的代码中有一个类,它有一些整数数据成员但没有方法.当我使用new()创建一个新对象时,是否存在用0初始化所有数据项的方法?

c++

1
推荐指数
1
解决办法
252
查看次数