我是C ++的初学者,我之前使用过C但从未使用过C ++。这是我的第一个程序之一,并且它应该做一些非常简单的事情,但是我甚至无法在方法之间传递字符串...当我用字符串调用方法setMode
时数组,方法实例接收一个空数组,而不是我发送的数组。为什么会这样?
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
#define LED_PATH "sys/class/leds/beaglebone:green:usr"
class LED{
private:
string path;
int number;
public:
LED(int number);
virtual void setMode(string mode[]);
virtual ~LED();
};
LED::LED(int number){
ostringstream fs;
this->number = number;
fs << LED_PATH << number;
this->path = string(fs.str());
cout << this->path << endl;
}
LED::~LED(){
}
void LED::setMode(string mode[]){
//Will use all fields of mode[] in the future
cout << "setMode: mode: " << mode[0].c_str() << endl;
}
int main(int argc, char* argv[]){
LED LEDs[4] = {LED(0), LED(1), LED(2), LED(3)};
string mode[argc-1];
//TODO Perform argc value safety check
for(int i=1; i<argc; i++){
mode[i] = string(argv[i]);
cout << mode[i].c_str()<<endl;
}
for(int i=0; i<4; i++){
LEDs[i].setMode(mode);
}
return 0;
}
输出:
debian@beaglebone:~/Desktop/LED_Cpp$ ./led on 1
sys/class/leds/beaglebone:green:usr0
sys/class/leds/beaglebone:green:usr1
sys/class/leds/beaglebone:green:usr2
sys/class/leds/beaglebone:green:usr3
on
1
setMode: mode:
setMode: mode:
setMode: mode:
setMode: mode:
答案 0 :(得分:5)
string mode[argc-1];
这使用专有GCC扩展。在标准C ++中,必须在编译时知道原始数组的大小。
你需要这样的东西:
if (argc < 4) { std::cerr << "error\n"; return EXIT_FAILURE; } string mode[4];
或者,非常优选,使用std::vector
:
std::vector<std::string> mode(argc-1);
for(int i=1; i<argc; i++){ mode[i] = string(argv[i]); cout << mode[i].c_str()<<endl; }
这会使mode[0]
为空。
for(int i=0; i<4; i++){ LEDs[i].setMode(mode); }
传递给std::vector
的数组(或setMode
)因此总是这样,第一个元素是一个空字符串。
void LED::setMode(string mode[]){
这是尝试将数组传递给函数。真正发生的是传递第一个元素的指针并且大小信息丢失。
传递原始数组(包括其大小信息)的正确方法是使用引用:
void LED::setMode(string (&mode)[4])
但正如我之前提到的,只需使用std::vector
,你就可以了。当您需要修改向量时,请通过&
传递,或通过const&
:
void LED::setMode(std::vector<std::string> const& mode)
在任何一种情况下,在方法内部,您当前只访问第一个元素:
cout << "setMode: mode: " << mode[0].c_str() << endl;
正如我们之前建立的那样,mode[0]
始终是空的。这就是为什么没有印刷的原因。
答案 1 :(得分:2)
你是一个人。您正在写信
mode[1]
在
for(int i=1; i<argc; i++){
mode[i] = string(argv[i]);
你使用
mode[0]
输出。