变量参数get不起作用

时间:2018-05-07 15:26:22

标签: c++

我正在创建可以创建List&#s;的字符串数组的CPP应用程序。当调用初始化时,它获得了可变参数,并应将它们插入到字符串数组中。它给出了分段错误。此外,如果我删除Students_Second_Group.push(),一切正常。有什么建议?

// Main.cpp

#include "List.h"

int main() {
    List Students_First_Group(4), Students_Second_Group(3);
    Students_First_Group.push("Jonas Jonaits", "Tomas Tomaitis", "Petras Petraitis", "Donatas Petkevicius");
    Students_Second_Group.push("Mantas Jonaitis", "Tautvydas Tomaitis", "Linas Linaitis");
    return 0;
}

// List.h

#ifndef _LIST_H_
#define _LIST_H_
    #include <iostream>
    #include <string>
    #include <vector>
    #include <cstdarg>
    using namespace std;

    class List {
    private:
        size_t size;
        vector<string> arr;
    public:
        List(int size);
        void push(const char* str...);
        ~List();
    };
#endif

// List.cpp

#include "List.h"

List::List(int s) {
    if(size > 0)
        size = s;
    else
        size = 10;
    arr = vector<string> (s);
}

void List::push(const char* str...) {
    va_list arg;
    va_start(arg, str);
    while (str) {
        arr.push_back(str);
        str = va_arg(arg, const char *);
    }
    va_end(arg);
}

List::~List() {}

1 个答案:

答案 0 :(得分:1)

你可以用varadic模板解决你的问题但是 因为它们是模板varadic模板应该放在标题

了解更多信息http://en.cppreference.com/w/cpp/language/parameter_pack

#include <iostream>
#include <string>
#include <vector>

using namespace std;

class List {
    private:
    size_t size;
    vector<string> arr;
    void push() {}
    public:
    List(int size);
    template<typename ... Rest>
    void push(const char* first, Rest ... rest) {
        arr.push_back(first);
        push(rest...);
    }
    ~List();
    };

List::List(int s) {
    if(size > 0)
        size = s;
    else
        size = 10;
    arr = vector<string> (s);
}

List::~List() {}

int main() {
    List Students_First_Group(4), Students_Second_Group(3);
    Students_First_Group.push("Jonas Jonaits", "Tomas Tomaitis", "Petras Petraitis", "Donatas Petkevicius");
    Students_Second_Group.push("Mantas Jonaitis", "Tautvydas Tomaitis", "Linas Linaitis");
    return 0;
}