Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将对象字段作为函数参数传递(特征向量)_C++ - Fatal编程技术网

C++ 如何将对象字段作为函数参数传递(特征向量)

C++ 如何将对象字段作为函数参数传递(特征向量),c++,C++,我想写一个函数,其中我将两个对象和它们的字段数组作为参数传递给它,以计算相似性度量 假设我有两个对象A和B,它们有像A.size,A.weight,A.color,A.id这样的字段 现在我想要一个函数,它用这些参数获取大小为2的数组,所以它看起来像这样: double measureSim (Car a, Car b, ??? feature[2]){ double value = 0; for(int i = 0; i < feature.size; i++){ dou

我想写一个函数,其中我将两个对象和它们的字段数组作为参数传递给它,以计算相似性度量

假设我有两个对象A和B,它们有像A.size,A.weight,A.color,A.id这样的字段

现在我想要一个函数,它用这些参数获取大小为2的数组,所以它看起来像这样:

double measureSim (Car a, Car b, ??? feature[2]){

 double value = 0;

 for(int i = 0; i < feature.size; i++){
    double += (A.feature[i] - B.feature[i]);
 }

return value
}
双重测量(a车、b车、特征[2]){
双值=0;
对于(int i=0;i
我希望你能理解我想说的话


编辑:要点是制作一个可以比较两个对象的任意文件的函数。例如,当进行集群时。我希望能够告诉函数要考虑哪些字段。

如果您试图传递某种类型的“对字段成员名称的引用”数组,并以这种方式迭代类,那么您将无法以这种方式进行操作。不能在类型的成员上循环

您可以将指针数组传递给成员:

#include <iostream>
#include <vector>

// (all doubles for exposition)
struct Car
{
    double size;
    double weight;
    double color;
    double id;
};

typedef double Car::*ptrToCarMember;

double measureSim(const Car& a, const Car& b, std::vector<ptrToCarMember> feature)
{
    double value = 0;

    for (auto el : feature) {
        value += a.*el - b.*el;
    }

    return value;
}

int main()
{
    Car a = { 1.0, 2.0, 4.0, 8.0 };
    Car b = { 1.0, 2.0, 3.0, 4.0 };

    {
        std::vector<ptrToCarMember> features{&Car::size};
        std::cout << measureSim(a, b, features) << '\n';
    }

    {
        std::vector<ptrToCarMember> features{&Car::id};
        std::cout << measureSim(a, b, features) << '\n';
    }

    {
        std::vector<ptrToCarMember> features{&Car::size, &Car::weight, &Car::color};
        std::cout << measureSim(a, b, features) << '\n';
    }
}

// $ g++ -std=c++11 -Wall main.cpp && ./a.out
// 0
// 4
// 1
#包括
#包括
//(展览会全部双人)
结构车
{
双倍大小;
双倍重量;
双色;
双id;
};
typedef双车::*ptrtocarmber;
双重测量(常数车和a、常数车和b、标准::矢量特征)
{
双值=0;
用于(自动el:功能){
值+=a.*el-b.*el;
}
返回值;
}
int main()
{
汽车a={1.0,2.0,4.0,8.0};
汽车b={1.0,2.0,3.0,4.0};
{
std::vector features{&Car::size};

std::cout假设您的所有字段都是相同类型的(例如,
float
),您正在查找指向成员的指针。语法如下:

// An example class with two fields to choose from
class A {
    float f1;
    float f2;
};

int main(int, char**) {

    // Declaration of a pointer-to-member
    float A::*ptr;

    // Assignment, note that we don't have an instance yet
    ptr = &A::f1;

    // Creating an actual instance
    A a;

    // Using the pointer on the instance
    a.*ptr = 3.14f;

    // Check that it worked. It did !
    std::cout << a.f1 << '\n';

    return 0;
}
//有两个字段可供选择的示例类
甲级{
浮球f1;
浮动f2;
};
int main(int,char**){
//指向成员的指针的声明
浮动A::*ptr;
//任务,请注意,我们还没有实例
ptr=&A::f1;
//创建实际实例
A A;
//在实例上使用指针
a、 *ptr=3.14f;
//检查它是否有效,它成功了!

如果你有对象,为什么要分别传递它们的成员作为参数。我遗漏了什么吗?也许你指的是指向成员变量的指针数组。但这对我来说没有什么意义。@Mahesh:他不一定希望每次调用都考虑到所有成员。请你再解释一下这个问题好吗你的建议是否可能?为什么这是个坏主意?@user2664856:像这样?:)是的,谢谢。你理解我的问题吗?我想指定在进行聚类时要考虑哪些成员。所以我需要衡量两个样本之间的相似性。你知道解决这个问题的更好方法吗?或者我应该问一个新问题吗关于这一点?@user2664856:我在回答的最后提出了一些想法。最终,对您的选择进行更广泛的探索将取决于您的代码的其余部分是什么样子、您的约束条件是什么、您的需求是什么,以及需要与顾问坐下来讨论一个小时才能解决的所有其他问题。最后问题:因为这似乎不是一个荒谬的问题,也不容易回答……为什么我被否决了?你能解释一种更简单的方法,告诉函数在集群时考虑哪些成员吗?例如@user2664856,它在将数组传递给函数之前在调用方一侧构建数组。你可能想要搜索对于它,可能已经有人问过了。@user2664856:我在回答中证明了这一点。@LightnessRacesinOrbit你要拿走我的生意吗?:p@Quentin当前位置这是一个寒冷的世界,我要养活我的嘴!