繁体   English   中英

C ++通过带有辅助函数的引用传递

[英]C++ passing by reference with helper functions

void BTreeTest::testOneBTreeLeafNode() {

BTreeLeafNode *test = new BTreeLeafNode();

BTreeData *info1 = new BTreeData;
BTreeData *info2 = new BTreeData;
BTreeData *info3 = new BTreeData;
BTreeData *info4 = new BTreeData;
BTreeData *info5 = new BTreeData;


setInfo(&*info1, (char *)"Lester", (char *)"24", (char *)"student", 6, 2, 7);
setInfo(&*info2, (char *)"David", (char *)"20", (char *)"student", 5, 2, 7);
setInfo(&*info3, (char *)"June", (char *)"4", (char *)"toddler", 4, 1, 7);
setInfo(&*info4, (char *)"Lisa", (char *)"18", (char *)"tutor", 4, 2, 5);
setInfo(&*info5, (char *)"Savannah", (char *)"22", (char *)"barista", 8, 2, 7);

correctData(&*info1, (char *)"Lester", (char *)"24", (char *)"student");
correctData(&*info2, (char *)"David", (char *)"20", (char *)"student");
correctData(&*info3, (char *)"June", (char *)"4", (char *)"toddler");
correctData(&*info4, (char *)"Lisa", (char *)"18", (char *)"tutor");
correctData(&*info5, (char *)"Savannah", (char *)"22", (char *)"barista");


delete info1;
delete info2;
delete info3;
delete info4;
delete info5;

delete test;

}

这是我为要构建的程序编写的测试。 但是,为了让我有一个更清晰易读的测试,我需要一个辅助函数。 这就是setInfo的目的。 这是该代码:

void setInfo(BTreeData *info, char *name, char *age, char *occupation, int  
   nameSize, int ageSize, int occSize) {

   strncpy(info->name, name, nameSize);
   strncpy(info->age, age, ageSize);
   strncpy(info->occupation, occupation, occSize);
}

问题是我正在尝试设置信息的值。 我正在尝试通过引用传递信息,以便我可以设置信息。 当我检查xCode调试器时,它可以正常工作,直到setInfo函数结束。 但是由于某种原因,当我的代码返回到testOneBTreeLeafNode内部以继续执行其余代码时,信息内的值会更改。 它有多余的垃圾,如下图所示。 我对通过引用的理解不强。 有人可以启发我吗?

在此处输入图片说明

注意David的年龄和职业应该是20岁还是学生。 它有20和学生,但也有其他不需要的垃圾。 为什么会这样呢?

如果有必要,这里是BTree结构:

//
//  BTree.hpp
//  CS130FinalProject
//
//  Created by Lester Dela Cruz on 2/19/16.
//  Copyright © 2016 Lester Dela Cruz. All rights reserved.
//

#ifndef BTree_hpp
#define BTree_hpp

#define M (5)
#define L (3)

#include <stdio.h>

struct BTreeData {
  char name[20];
  char age[3];
  char occupation[30];
};

struct BTreeLeafNode {
  BTreeData dataItems[L];
};

struct BTreeInternalNode {
  char keys[M-1][20];
  BTreeLeafNode *branch[M];
};

class BTree {

};

#endif /* BTree_hpp */

这是因为您没有复制终止的空字符。

您正在堆上分配BtreeData类的新实例。 每个实例的初始副本包含随机的二进制垃圾。 堆上分配的POD数据不会初始化为零。

然后,您使用strncpy ()初始化字段。 要将age成员初始化为“ 20”,您要为ageSize传递2,因此strncpy ()将复制'2'和'0',但不复制结尾的\\ 0,后者应终止C样式字符串。 因此,调试器看不到尾随的0,然后继续打印找到的任何随机垃圾,因为正如我所说,类实例是从堆中分配的,并且继承了堆已分配内存中以前的任何随机数据。

只要您引起我的注意,还有一些其他善意的批评:

setInfo(&*info1, (char *)"Lester", (char *)"24", (char *)"student", 6, 2, 7);

首先,“&*”绝对没有完成任何事情。 没什么区别。

其次,建议不要使用显式(char *)强制转换。 之所以必须这样做,是因为字符串文字是const char ,而setInfo ()函数将char *作为参数。

除了您的setInfo ()不需要首先使用char *参数。 让我们更改setInfo ()以将const char *作为参数,并摆脱这些难看的,丑陋的演员表。

这看起来像是较大应用程序的一部分,因此也许有理由要传递显式的字符串长度计数,但是没有实际原因。 只是让事情顺其自然,使用strcpy ()而不是strncpy (),而strncpy字符计数。

更好的是,由于我们在这里谈论的是C++ ,所以让我们摆脱所有的char数组,并用std::string替换它们。 char数组是如此……上个世纪。

我们有协议吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM