C ++ valarray / шаблоны классов не работают - PullRequest
0 голосов
/ 17 июля 2011

это мой первый пост здесь, но я часто читал различные темы здесь.

Теперь я застрял с проблемой программирования на c ++, в основном это шаблонный класс "Pair", которыйдолжен содержать 2 числа целых чисел и затем включаться в другой класс под названием Wine.Проблема в том, что я не получаю правильные конструкторы или файл заголовка в соответствии с моим компилятором!

Посмотрите и, пожалуйста, попробуйте мне помочь, главная проблема в том, что valarrays не будет принимать int как аргументы +Я не понимаю, как я могу преобразовать обычный массив int в valarray только с одним аргументом конструктора:

#ifndef Derp
#define Derp
#include <valarray>

template <typename T1, typename T2>
class Pair
{
private:
T1 a;
T2 b;
public:
T1 & first();
T2 & second();
T1 first() const {return a;}
T1 second() const {return b;}
Pair(const T1 & aval, const T2 & bval) : a(aval), b(bval) {}
Pair() {}
};

template Pair<std::valarray<int>, std::valarray<int> >;

typedef std::valarray<int> ArrayInt;
typedef Pair<ArrayInt, ArrayInt> PairArray;

class Wine
{       
private:
    typedef std::valarray<int> ArrayInt;
    typedef Pair<ArrayInt, ArrayInt> PairArray;
    std::string name;
    int years;
    PairArray arr;
public:
    Wine(const char * l, int y, const int yr[], const int bot[]);
    Wine(const char * l, int y);
    void GetBottles();
    std::string Label();
    int sum();
    void show();
};


#endif

Итак, вот заголовочный файл, теперь приходит первый .cpp файл со всеми определениями функций:

#include <iostream>
#include <valarray>
#include <cstring>
#include "K14O1.h"

template <typename T1, typename T2>
T1 & Pair<T1, T2>::first()
{
return a;
}

template <typename T1, typename T2>
T2 & Pair<T1, T2>::second()
{
return b;
}


Wine::Wine(const char * l, int y, const int yr[], const int bot[])
: arr(y, y)
{
name = l;
years = y;
for(int a = 0; a < y; a++)
{
    arr.first()[a] = yr[a];
    arr.second()[a] = bot[a];
}
}

Wine::Wine(const char * l, int y)
: arr()
{
name = l;
years = y;
arr.first() = y;
arr.second() = y;
}

void Wine::GetBottles()
{
for(int c = 0; c < years; c++)
{
    std::cout << "Skriv in antal buteljer för det året: ";
    std::cin >> arr.first()[c];
    std::cout << "Skriv in årgång: ";
    std::cin >> arr.second()[c];
}
}

std::string Wine::Label()
{
return name;
}

typedef std::valarray<int> ArrayInt;
int Wine::sum()
{
int b;

int ar = 0;
while(arr.second()[b])
{
    ar += arr.second()[b];
    b++;
};

return ar;
 }

 void Wine::show()
 {
std::cout << "Vin: " << name << std::endl;
int b = 0;
while(arr.first()[b])
{
    std::cout << arr.first()[b] << "\t" << arr.second()[b] << std::endl;
    b++;
};
}

Наконец, последний файл .cpp:

#include <iostream>
#include <valarray>
#include "K14O1.h"

using namespace std;

int main(int argc, char * argv[])
{
const int YRS = 3;

int y[YRS] = {1993, 1995, 1998};
int b[YRS] = {48, 60, 72};

Wine more("Gushing Grape Red", YRS, y, b);

cout << "Skriv in vinets namn: ";
char lab[50];
cin.getline(lab, 50);
cout << "Skriv in antal årgångar: ";
int yrs;
cin >> yrs;

Wine holding(lab, yrs);

holding.GetBottles();
holding.show(); 

more.show();

cout << "Totalt antal buteljer av " << more.Label()
<< ": " << more.sum() << endl;
cout << "HEJDASADAN" << endl;

return 0;   
}

Я был бы чрезвычайно благодарен, если бы вы, ребята, могли сказать мне, что не так и как это исправить.Сейчас я работаю над книгой Стивена Праташа по С ++, и это упражнение, спасибо!

Любые другие общие советы по кодированию также были бы замечательными, хорошо проведите время!

1 Ответ

2 голосов
/ 17 июля 2011

Что не так: Ну, если честно, с чего мне начать?

Во-первых, существует структура std::pair.Во-вторых, материал valarray был полной ошибкой и больше не использовался.В-третьих, const char*, int[] аргументы?Owch.Можете ли вы сказать, переполнение буфера и повреждение памяти?В-четвертых,

int Wine::sum()
{
    int b;    
    int ar = 0;
    while(arr.second()[b])
    {
        ar += arr.second()[b];
        b++;
    }    
    return ar;
 }

Вы не инициализировали b.Неопределенное поведение.

Руководство и список книг Definitive C ++

В этом вопросе перечислены хорошие книги по C ++, а Стивен Прата упоминается как очень плохая книга.Этот пример кода поддерживает это.Сожги свою книгу и купи ту, которая не отстой, будет моей рекомендацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...