如何在数组中存储对象指针

时间:2015-12-19 13:20:10

标签: c++ arrays pointers object

我对c ++很新,这个问题让我很难受。 在我的项目中,我使用SFML库来创建小行星。我声明了一个名为function LoadTableFields(sFieldID, Name, newdiv, FieldValue, TableValues) { var TblValues = JSON.parse(TableValues); var tHTML = ''; tHTML += '<table class="table table-bordered table-striped" id="table_' + sFieldID + '" name="' + Name + '"><thead><tr >'; var headers = []; $.each(TblValues, function(i, item) { if (headers.indexOf(item.Name) === -1) { headers.push(item.Name); tHTML += '<th class="text-center">' + item.Name + '</th>'; } }); tHTML += '</tr></thead><tbody><tr id="row_0" data-id="0">'; var Count = 0; $.each(TblValues, function(i, item) { if (item.FieldType == 'TextBox') { if (item.Name === headers[0]) { tHTML += '<tr>'; } tHTML += '<td data-name=' + item.Name + ' class="col-xs-3 form-group"><input type="text" id=' + item.Name + i + ' name=' + item.Name + i + ' placeholder=' + item.Name + ' class="form-control" value=' + item.FieldValue + ' /></td>'; if (item.Name === headers[headers.length - 1]) { tHTML += '</tr>'; } } else if (item.FieldType == 'DropDownList') { if (item.Name === headers[0]) { tHTML += '<tr>'; } var options = LoadTableFieldEnums(sFieldID, item.Name, item.FieldValue); tHTML += '<td data-name=' + item.Name + ' class="col-xs-3 form-group"><select id=' + item.Name + i + ' name=' + item.Name + i + ' class="form-control">' + options + '</select></td>'; if (item.Name === headers[headers.length - 1]) { tHTML += '</tr>'; } } else if (item.FieldType == 'CheckBox') { tHTML += '<td data-name=' + item.Name + '><input type="checkbox" id=' + item.Name + i + ' name=' + item.Name + i + '/></td>'; } else if (item.FieldType == 'Date') { if (item.Name === headers[0]) { tHTML += '<tr>'; } tHTML += '<td data-name=' + item.Name + ' class="col-xs-3 form-group"><div class="input-group date"><input type="text" class="form-control" id=' + item.Name + '0' + ' name=' + item.Name + '0' + ' /><span class="input-group-addon add-on"><span class="glyphicon glyphicon-calendar"></span></span></div></td>'; if (item.Name === headers[headers.length - 1]) { tHTML += '</tr>'; } Count = i; } else { tHTML += '<td data-name=' + item.Name + '></td>'; } }); tHTML += '</tr></tbody></table>'; tHTML += '<a id="add_row_' + sFieldID + '" class="btn btn-default pull-left" onclick="AddNewTableRow(' + sFieldID + ');">Add Row</a><a id="delete_row_' + sFieldID + '" class="pull-right btn btn-default" onclick="DeleteTableRow(' + sFieldID + ');">Delete Row</a>'; newdiv.innerHTML += tHTML; $('#divComplete').append(newdiv); } function AddNewTableRow(sFieldID) { // Dynamic Rows Code // Get max row id and set new id var newid = 0; $.each($("#table_" + sFieldID + " tr"), function() { if (parseInt($(this).data("id")) > newid) { newid = parseInt($(this).data("id")); } }); newid++; var tr = $("<tr></tr>", { id: "row_" + newid, "data-id": newid }); // loop through each td and create new elements with name of newid $.each($("#table_" + sFieldID + " tbody tr:nth(0) td"), function() { var cur_td = $(this); var children = cur_td.children(); // add new td and element if it has a nane if ($(this).data("name") != undefined) { var td = $("<td></td>", { "data-name": $(cur_td).data("name") }); // Date control if ($(children[0]).prop('tagName') == 'DIV') { var strname = $(cur_td).data("name"); var c = $('<div class="input-group date"><input type="text" class="form-control" id=' + strname + '' + newid + ' name=' + strname + '' + newid + ' /><span class="input-group-addon add-on"><span class="glyphicon glyphicon-calendar"></span></span></div>'); c.appendTo($(td)); } else { var c = $(cur_td).find($(children[0]).prop('tagName')).clone().val(""); c.attr("name", $(cur_td).data("name") + newid); c.attr("id", $(cur_td).data("name") + newid); c.appendTo($(td)); } td.appendTo($(tr)); } else { var td = $("<td></td>", { 'text': $('#table_' + sFieldID + ' tr').length }).appendTo($(tr)); } }); // add the new row $(tr).appendTo($('#table_' + sFieldID)); } function DeleteTableRow(sFieldID) { var newid = 0; $.each($("#table_" + sFieldID + " tr"), function() { if (parseInt($(this).data("id")) > newid) { newid = parseInt($(this).data("id")); } }); if (newid != 0) { $("#row_" + (newid)).remove(); } } 的类,并希望在类中创建一组小行星对象。有人建议我将对象存储在数组中。后来我才知道不可能在数组中存储对象,但是你可以存储指向对象的指针。

总之,我想:

创建_asteroids

中的对象

- 存储指向数组内对象的指针

- 能够通过数组中的指针调用这些对象并更改其值

我该怎么做呢?以下是我的一些代码:

_asteroids

2 个答案:

答案 0 :(得分:1)

当然可以在std :: vector

中保存Asteroid
class Asteroid {};

std::vector<Asteroid> asteroids;

Asteroid as1;
asteroids.push_back(as1);

答案 1 :(得分:1)

在C ++中,你应该 - 如果可能/合理 - 避免(原始)指针和C风格的数组。 C ++提供标准容器。与C风格的数组一样,它们可以包含所有类型的元素,但它们具有C风格数组不具备的一些优点。例如,大多数容器可以在需要时增长/缩小 - 换句话说,它们的大小可以在添加或删除元素时自行调整。最重要的是,它们具有许多成员函数,允许您以简单的方式对包含的元素进行操作。

vector容器非常受欢迎。在许多方面,一旦添加了元素,它就像一个数组,即使用var[i]访问元素。您可以使用push_back将元素添加到向量的末尾。

示例:

std::vector<_asteroids> allAsteroids;

allAsteroids.push_back(_asteroids()); // Add _asteroids object to end of vector
allAsteroids.push_back(_asteroids()); // Add _asteroids object to end of vector
allAsteroids.push_back(_asteroids()); // Add _asteroids object to end of vector

cout << allAsteroids.size() << endl;  // Will print 3

for (auto& a : allAsteroids)  // Iterate over all asteroids in the vector
{
    a.Update();  // Call Update for current element
}

// The same as above in a different way
for (int i = 0; i < allAsteroids.size(); i++)
{
    allAsteroids[i].Update();  // Call Update for i'th element
}

这只是您可以使用vector执行的操作的几个示例。还有更多。

检查http://www.cplusplus.com/reference/vector/vector/以获取更多信息 - vector的所有成员函数显示在该网站的左侧。