在主要需要使用class作为参数的语法吗?

问题描述 投票:0回答:1

This问题指出main可以用some restrictions定义实现。因此,我编写了以下C++代码,以尝试以下main的签名:

main.h

class MyClass {
private:
    int i;

public:
    MyClass();
    inline int geti() {
        return i;
    }
    inline void seti(int i)  {
        this->i = i;
    }
    ~MyClass();
};

MyClass::MyClass() {
    this->i = 2;
}

MyClass::~MyClass() {
}

main.c ++

#include <iostream>
#include "main.h"


int main(MyClass myClass) {
    std::cout << myClass.geti() << std::endl; 
    return 0;
}

哪个给出以下结果:

命令g++ -o main main.c++ -O3成功编译并显示警告:

main.c++:5:5: warning: first argument of ‘int main(MyClass)’ should be ‘int’ [-Wmain]
    5 | int main(MyClass myClass) {
      |     ^~~~
main.c++:5:5: warning: ‘int main(MyClass)’ takes only zero or two arguments [-Wmain]

命令clang++ -o main main.c++ -std=c++14给出错误:

main.c++:5:5: error: first parameter of 'main' (argument count) must be of type 'int'
int main(MyClass myClass) {
    ^
1 error generated.

main生成的g++文件给出SIGSEGV(为什么?)

因此,如果可以定义main的实现,为什么clang产生错误而g++生成的文件给出SIGSEGV


我也走得更远,创建了一个不同的代码,因此我可以将MyClass对象传递给main.c++,如下所示:

#include <iostream>
#include "main.h"
#include <unistd.h>


int main() {
    MyClass myClass;
    execve("./main",myClass,NULL);
    return 0;
}

但是,由于execve将第二个参数设为char* const *,因此不会编译。如何将myClass对象传递给main生成的g++文件?

c++ main
1个回答
0
投票

您很近。您已经确定了尝试将其作为参数传递给main()的主要问题-无法解决。 main()的声明是由标准定义的,并且您只能将字符串值(以null终止的字符数组... C-Strings)作为参数传递。

例如,您需要在main()中为您的课程创建一个实例,>

#include <iostream>
#include "main.h"

int main() {
    MyClass myClass;
    std::cout << myClass.geti() << std::endl; 
    return 0;
}

您的main.h标头在第10行有一个可变的阴影问题:

    inline void seti(int i)  {

int i遮盖了第3行的先前声明,例如int i;(尽管后果不太可能发生)。只需将第二个声明中的变量名称替换为j(或您喜欢的任何名称)。您的代码将在没有警告的情况下进行编译,例如

class MyClass {
private:
    int i;

public:
    MyClass();
    inline int geti() {
        return i;
    }
    inline void seti(int j)  {
        this->i = j;
    }
    ~MyClass();
};

MyClass::MyClass() {
    this->i = 2;
}

MyClass::~MyClass() {
}

示例使用/输出

$ ./bin/main
2

让我知道是否还有其他问题。

© www.soinside.com 2019 - 2024. All rights reserved.