在C ++中的循环中动态初始化和声明随机实体的多个变量

时间:2018-11-01 20:17:04

标签: c++ visual-studio c++11 random macros

这是我的代码:

#include <cstdlib>
#include <ctime>
#include <stdio.h>
#include <vector>
#define ENTITY(A) entity##A
#define ALM(A) alm##A

struct TEntity{
private:
    int sumx;
    int sumy;
    const char * rep;
    int m_ix;
    int m_iy;
public:
    TEntity(int x, int y, int sum_x, int sum_y, const char * txt);
};

TEntity::TEntity(int x, int y, int sum_x, int sum_y, const char * txt) {
    m_ix = x;
    m_iy = y;
    sumx = sum_x;
    sumy = sum_y;
    rep = txt;
}

class IAlmacenable {
private:
    void * element;
public:
    IAlmacenable(void * e);
    IAlmacenable();
    void * getValue();
};

IAlmacenable::IAlmacenable(void *e) {
    element = e;
}

IAlmacenable::IAlmacenable() {
    element = nullptr;
}

void * IAlmacenable::getValue() {
    return element;
}

class TList {
private:
     std::vector<IAlmacenable*> elementos;
     int position;
public:
    TList();

    int Size();

    int Push(IAlmacenable* psz);
};

TList::TList() {
    elementos = std::vector<IAlmacenable*>();
    position = 0;
}

int TList::Size() {
    return elementos.size();
}

int TList::Push(IAlmacenable* psz) {
    int res = 0;
    if (elementos.size() >= elementos.max_size()) {
        res = -1;
    }
    else {
        elementos.push_back(psz);
    }
    return res;
}

int main(){
    srand(time(NULL));

    TList *list = new TList();
    //we can put entities in the list and the rest will be filled up to 5
    int size = list->Size();
    for(int i = size; i<5;i++){
        const char c[] = {(rand() % 2 ? 65 + rand() % 25 : 97 + rand() % 25), '\0'};
        TEntity ENTITY(i)(rand() % 10, rand() % 10, rand() % 5, rand() % 5, c);
        IAlmacenable ALM(i)(&ENTITY(i));
        list->Push(&ALM(i));
        size++;
    }
    //do things like printing their value...
    delete list;
    return 0;
}

每次运行“ TEntity ENTITY(i)”行时,我都需要创建一个新变量, 问题是它总是创建相同的变量,我认为这是因为它创建了变量entityi,因此它覆盖了相同的变量,此外似乎它生成的随机数始终是相同的数字,因为所有实体都具有相同的值其所有参数中的值。 c变量在a-z,A-Z之间创建const char *随机变量,因为不需要它,所以不放置打印代码,那我该怎么办?有没有办法动态创建值随机的实体变量?

编辑 这是已修复的新代码(由于不再需要宏,因此已删除了宏,并且包含了执行该代码所必需的代码),但是仍然存在相同的问题,即它们是使用相同的参数生成的(因为它们是仍然是相同的变量):

#include <cstdlib>
#include <ctime>
#include <stdio.h>
#include <vector>
#include <conio.h>
#include <windows.h>

struct TEntity{
private:
    int sumx;
    int sumy;
    const char * rep;
    int m_ix;
    int m_iy;
public:
    TEntity(int x, int y, int sum_x, int sum_y, const char * txt);
    void movimiento();
    void pinta();
};

TEntity::TEntity(int x, int y, int sum_x, int sum_y, const char * txt) {
    m_ix = x;
    m_iy = y;
    sumx = sum_x;
    sumy = sum_y;
    rep = txt;
}

void TEntity::movimiento() {
    m_ix += sumx;
    m_iy += sumy;
}

void TEntity::pinta() {
    gotoxy(static_cast<short int>(m_ix), static_cast<short int>(m_iy));
    printf("%s", rep);
}

void gotoxy(short int x, short int y)
{ 
    COORD pos = {x, y};
    HANDLE output = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(output, pos);
}

void clear()
{
    system("cls");
}

class IAlmacenable {
private:
    void * element;
public:
    IAlmacenable(void * e);
    IAlmacenable();
    void * getValue();
};

IAlmacenable::IAlmacenable(void *e) {
    element = e;
}

IAlmacenable::IAlmacenable() {
    element = nullptr;
}

void * IAlmacenable::getValue() {
    return element;
}

class TList {
private:
     std::vector<IAlmacenable*> elementos;
     int position;
public:
    TList();

    int Size();

    int Push(IAlmacenable* psz);

    IAlmacenable* First();

    IAlmacenable* Next();
};

TList::TList() {
    elementos = std::vector<IAlmacenable*>();
    position = 0;
}

int TList::Size() {
    return elementos.size();
}

int TList::Push(IAlmacenable* psz) {
    int res = 0;
    if (elementos.size() >= elementos.max_size()) {
        res = -1;
    }
    else {
        elementos.push_back(psz);
    }
    return res;
}

IAlmacenable* TList::First() {
    IAlmacenable* res;
    if (elementos.empty()) {
        res = nullptr;
    }
    else {
        res = elementos.front();
        position = 1;
    }
    return res;
}

IAlmacenable* TList::Next() {
    IAlmacenable* res;
    if (elementos.empty()) {
        res = nullptr;
    }
    else {
        int pos = position;
        int size = elementos.size();
        if (pos < size) {
            res = elementos.at(position);
            position++;
        }
        else {
            res = this->First();
        }
    }
    return res;
}

int main(){
    srand(time(NULL));

    TList *list = new TList();
    //we can put entities in the list and the rest will be filled up to 5
    int size = list->Size();
    for(int i = size; i<5;i++){
        const char c[] = {(rand() % 2 ? 65 + rand() % 25 : 97 + rand() % 25), '\0'};
        TEntity *entity = new TEntity(rand() % 10, rand() % 10, rand() % 5, rand() % 5, c);
        IAlmacenable *alm = new IAlmacenable(entity);
        list->Push(alm);
        size++;
    }
    while(true){
        clear();
        for (int i = 0; i < size; i++) {
            reinterpret_cast<TEntity *>(list->Next()->getValue())->pinta();
            reinterpret_cast<TEntity *>(list->Next()->getValue())->movimiento();
        }
        Sleep(2000);
    }
    delete list;
    return 0;
}

enter image description here

1 个答案:

答案 0 :(得分:3)

这里有些混乱。

一些要点:

  1. 您已经知道,宏不适合用途;您每次只是创建一个变量名entityi
  2. 没关系!无论如何,该对象仅在循环迭代期间存在。 C ++不允许您同时创建多个具有相同名称的对象。实际上,您可以删除整个宏内容,而只需调用对象entity;
  3. 现在这已经不合时宜,您将得到重复的结果,因为您要存储一个指向该局部变量的每次迭代的指针-在每种情况下,这都是指向被破坏对象的悬挂指针。不要存储悬空的指针!

您可以:

  • 动态分配要添加到列表中的对象,或者
  • 存储实际对象,而不是指向对象的指针。

无论哪种方式,本地作用域名称都不相关,并且每次循环迭代时都不必重复更改。