分布式Server:IDL_ssgrade

源程序:【免费】分布式Server:IDL-ssgrade资源-CSDN文库

// Don't modify this file as it will be overwritten.
//
#include "IDL_ssgrade.h"

Grade::Grade(const Grade &IDL_s){
  name = IDL_s.name;
  ID = IDL_s.ID;
  score = IDL_s.score;
}

Grade& Grade::operator= (const Grade &IDL_s){
  if (this == &IDL_s) return *this;
  name = IDL_s.name;
  ID = IDL_s.ID;
  score = IDL_s.score;
  return *this;
}

void Grade::Marshal(CDR *cdr) const {
  cdr->PutString(name);
  cdr->PutString(ID);
  cdr->PutFloat(score);
}

void Grade::UnMarshal(CDR *cdr){
  {
    char *IDL_str;
    cdr->GetString(IDL_str);
    if(name != NULL )
    {
        delete name;
        name = NULL;
    }
    name = IDL_str;
  }
  {
    char *IDL_str;
    cdr->GetString(IDL_str);
    if(ID != NULL )
    {
        delete ID;
        ID = NULL;
    }
    ID = IDL_str;
  }
  cdr->GetFloat(score);
}

AverageGrade::AverageGrade(const AverageGrade &IDL_s){
  avgScore = IDL_s.avgScore;
  ID1 = IDL_s.ID1;
  ID2 = IDL_s.ID2;
  ID3 = IDL_s.ID3;
}

AverageGrade& AverageGrade::operator= (const AverageGrade &IDL_s){
  if (this == &IDL_s) return *this;
  avgScore = IDL_s.avgScore;
  ID1 = IDL_s.ID1;
  ID2 = IDL_s.ID2;
  ID3 = IDL_s.ID3;
  return *this;
}

void AverageGrade::Marshal(CDR *cdr) const {
  cdr->PutFloat(avgScore);
  cdr->PutString(ID1);
  cdr->PutString(ID2);
  cdr->PutString(ID3);
}

void AverageGrade::UnMarshal(CDR *cdr){
  cdr->GetFloat(avgScore);
  {
    char *IDL_str;
    cdr->GetString(IDL_str);
    if(ID1 != NULL )
    {
        delete ID1;
        ID1 = NULL;
    }
    ID1 = IDL_str;
  }
  {
    char *IDL_str;
    cdr->GetString(IDL_str);
    if(ID2 != NULL )
    {
        delete ID2;
        ID2 = NULL;
    }
    ID2 = IDL_str;
  }
  {
    char *IDL_str;
    cdr->GetString(IDL_str);
    if(ID3 != NULL )
    {
        delete ID3;
        ID3 = NULL;
    }
    ID3 = IDL_str;
  }
}
 

这段代码定义了两个类,Grade 和 AverageGrade,它们分别用于表示单个学生的成绩和三个学生成绩的平均值。这两个类都支持拷贝构造函数、赋值操作符重载、以及序列化和反序列化操作。这里使用的是一种类似于CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构)中的CDR(Common Data Representation,通用数据表示)机制来进行数据的序列化和反序列化。

Grade 类

  • 拷贝构造函数:接收一个Grade对象作为参数,将它的name(姓名)、ID(学号)和score(成绩)复制到新对象中。
  • 赋值操作符重载:检查自赋值情况,然后将右侧对象的nameIDscore复制到左侧对象中。
  • Marshal 方法:用于序列化Grade对象的数据到CDR流中。它将nameID作为字符串,score作为浮点数写入CDR流。
  • UnMarshal 方法:用于从CDR流中反序列化Grade对象的数据。它从CDR流中读取字符串作为nameID,读取浮点数作为score。注意,这里在赋值前会检查nameID是否已分配内存,如果已分配,则先释放旧内存,以避免内存泄漏。然而,代码中的字符串管理存在潜在问题,因为cdr->GetString(IDL_str);这一行看起来像是直接从CDR流中读取字符串到IDL_str指针,但没有显示分配内存给IDL_str,这可能会导致未定义行为。通常,CDR实现应该负责为字符串分配内存,并在不再需要时提供释放内存的机制。

AverageGrade 类

  • 拷贝构造函数:接收一个AverageGrade对象作为参数,将它的avgScore(平均成绩)、ID1ID2ID3(三个学生的学号)复制到新对象中。
  • 赋值操作符重载:检查自赋值情况,然后将右侧对象的avgScoreID1ID2ID3复制到左侧对象中。
  • Marshal 方法:用于序列化AverageGrade对象的数据到CDR流中。它将avgScore作为浮点数,ID1ID2ID3作为字符串写入CDR流。
  • UnMarshal 方法:与Grade类的UnMarshal方法类似,用于从CDR流中反序列化AverageGrade对象的数据。它读取浮点数作为avgScore,读取三个字符串作为ID1ID2ID3。同样地,这里也存在潜在的内存管理问题。

注意事项

  • 内存管理:上述代码中的字符串内存管理可能存在问题。在实际应用中,需要确保CDR流的实现正确地管理了字符串的内存,或者在代码中显式地处理内存分配和释放。
  • 错误处理:代码中没有显示错误处理逻辑,例如检查CDR操作是否成功。在实际应用中,应该添加适当的错误处理来确保数据的完整性和程序的健壮性。
  • 代码风格:代码中的变量命名(如IDL_sIDL_str)可能不够直观,使用更具描述性的命名可以提高代码的可读性。

你可能感兴趣的:(分布式,分布式,c++,网络安全,C,Windows,课程设计,操作系统)